Python解析xml与JSON
xml与json是常用的文件交换格式,常用来表示网页的html则是xml的变种。解析xml和json在web开发中有着重要应用。
DOM解析XML
文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,然后可以使用DOM API访问或修改xml。
xml示例:
<!-- movies.xml -->
<collection type="New Arrivals">
<movie title="Enemy Behind">
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
</collection>
python中用xml.dom.minidom来解析xml:
import xml.dom.minidom
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print("Root element : %s" % collection.getAttribute("type"))
# get attribute of an element
movies = collection.getElementsByTagName("movie")
# get child elements' collection by tag name
for movie in movies:
print("*****Movie*****")
if movie.hasAttribute("title"):
print "Title: %s" % movie.getAttribute("title")
stars = movie.getElementsByTagName('stars')[0]
print ("Stars: %s" % stars.childNodes[0].data)
description = movie.getElementsByTagName('description')[0]
print ("Description: %s" % description.childNodes[0].data)
SAX解析XML
SAX是一种基于事件驱动的xml解析器,SAX包括两个部分解析器和事件处理器。解析器负责读取xml文件并向事件处理器发送消息。事件处理器主要需要对三个事件进行处理:
startElement 元素开始事件,当读取元素头标签时触发
endElement 元素结束事件,当读取元素头标签时触发
characters 内容事件,当读取元素头标签与尾标签之间内容时触发
解析器由Python提供,事件处理器需要继承xml.sax.ContentHandler类并重写相应的事件处理函数:
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.currentTag = ""
self.stars = ""
self.description = ""
def startElement(self, tag, attributes):
# "tag" stands for the name of current tag
# "attributes" is a dict of attributes of current tag
self.currentTag = tag
if tag == "movie" :
print "*****Movie*****"
title = attributes["title"]
print "Title:", title
#only parse tag <movie>, ignore other tags
def endElement(self, tag):
if self.currentTag == "stars":
print "Stars:", self.stars
elif self.currentTag == "description":
print "Description:", self.description
self.currentTag = ""
def characters(self, content):
# "content" stands for the str between <tag> and </tag>
if self.currentTag == "stars":
self.stars = content
elif self.currentTag == "description":
self.description = content
if __name__ == "__main__" :
# create XMLReader
parser = xml.sax.make_parser()
# implement ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movie.xml")
JSON解析
JSON(JavaScript Object Notation),是一种轻量级的数据交换格式。JSON 语法是 JavaScript 对象表示语法的子集:
- 数据保存在键值对中
- 键值对之间用","分隔
- "{}"保存字典(JS中的对象)
- "[]"保存列表(JS中的数组)
示例:
>>> import json
>>> obj = [True, False,None, 3.14, [1,2,3], {'name':'user'}];
>>>> jsonString = json.dumps(obj)
>>> print(jsonString)
[true, false, null, 3.14, [1, 2, 3], {"name": "user"}]
>>> json.loads(jsonString)
[True, False, None, 3.14, [1, 2, 3], {u'name': u'user'}]
json.dumps方法提供了很多参数可供选择,比较常用的有sort_keys(对dict对象进行排序,默认dict是无序存放的),separators,indent等参数。
json模块只能对Python内置类型进行编码。若要使自定义类可以编码,需要自定义MyEncoder类继承json.JSONEncoder并重写default方法返回一个dict,其中的键值对将被添加到JSON中。
调用MyEncoder.encode(obj)方法,将会根据default方法的定义返回JSON字符串。
自定义MyDecoder类,并继承json.JSONDecoder。并在初始化JSONDecoder类时向object_hook参数传入一个可以将dict转换为类的方法对象。
Tips:
obj.__dict__是一个包含当前对象所有属性(不包括方法)的字典,无需手动添加属性。使用
getattr(module,class_name)获得类(type对象)
示例:
import json
class Person(object):
"""docstring for Person"""
def __init__(self, name, age):
self.name = name
self.age = age
class MyEncoder(json.JSONEncoder):
def default(self,obj):
#convert object to a dict
d = {}
d['__class__'] = obj.__class__.__name__
d['__module__'] = obj.__module__
d.update(obj.__dict__)
return d
class MyDecoder(json.JSONDecoder):
def __init__(self):
json.JSONDecoder.__init__(self,object_hook=self.dict2object)
def dict2object(self,d):
#convert dict to object
if '__class__' in d:
class_name = d.pop('__class__')
module_name = d.pop('__module__')
module = __import__(module_name)
class_ = getattr(module,class_name)
args = dict((key.encode('ascii'), value) for key, value in d.items()) #get args
inst = class_(**args) #create new instance
else:
inst = d
return inst
p = Person('Peter',22)
d = MyEncoder().encode(p)
o = MyDecoder().decode(d)
print d
print type(o), o
Python解析xml与JSON的更多相关文章
- python 解析XML python模块xml.dom解析xml实例代码
分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...
- python解析xml模块封装代码
在python中解析xml文件的模块用法,以及对模块封装的方法.原文转自:http://www.jbxue.com/article/16586.html 有如下的xml文件:<?xml vers ...
- python解析xml之lxml
虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势.除了速度上的优势,lxml在使用方面,易用性也非常好.这里将以下面的xml数据为例,介绍l ...
- python解析xml
python解析xml import xml.dom.minidom as minidom dom = minidom.parse("aa.xml") root = dom.get ...
- python 解析xml
在工作中很多时候都要用到xml,使用这个时候难免会设计到解析他,然后就研究了一下python解析xml问题,看了很多东西,python有很多解析xml的包,但是也折腾我好一段时间,最后选择了这个方法. ...
- Python 解析 XML 文件生成 HTML
XML文件result.xml,内容如下: <ccm> <metric> <complexity>1</complexity> <unit> ...
- Python 解析XML实例(xml.sax)
已知movies.xml <collection shelf="New Arrivals"> <movie title="Enemy Behind&qu ...
- boost-使用property_tree来解析xml、json
property_tree是一个保存了多个属性值的树形数据结构,可以用来解析xml.json.ini.info文件.要使用property_tree和xml解析组件的话需要包含"boost/ ...
- 横向对比分析Python解析XML的四种方式
横向对比分析Python解析XML的四种方式 在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜 ...
随机推荐
- [Openwrt 项目开发笔记]:PHP+Nginx安装(七)
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 在上一节中,我们已经搭建了MySQL数据库了,因 ...
- Unity3D中随机函数的应用
电子游戏中玩家与系统进行互动的乐趣绝大多数取决于事件发生的不可预知性和随机性.在unity3D的API中提供了Random类来解决随机问题. 最简单的应用就是在数组中随机选择一个元素,使用Random ...
- 开源一款强大的文件服务组件(QJ_FileCenter)(系列一)
系列文章 1. 开源一款强大的文件服务组件(QJ_FileCenter)(系列一) 2. 开源一款强大的文件服务组件(QJ_FileCenter)(系列二 安装说明) 3. 开源一款强大的文件服务组件 ...
- .net core 滑动+点击汉字验证码
用 .net core 写的 滑动+点击汉字的验证码,代码比较简单就不做说明了. github地址 https://github.com/wangchengqun/NetCoreVerificat ...
- Kotlin 初体验
本文由作者邹丽萍授权网易云社区发布. 背景 Kotlin 是 JetBrains 公司(著名的 IntelliJ IDEA 正是由这家公司开发的,Android Studio 也是基于 IDEA 的) ...
- Restframework 认证authentication 组件实例-1
1. 创建用户表和 token表 class User(models.Model): user =models.CharField(max_length=) pwd =models.CharField ...
- 简单版nginx lua 完成定向流量分发策略
本文链接:https://www.cnblogs.com/zhenghongxin/p/9131362.html 公司业务前端是使用 “分发层+应用层” 双层nginx架构,目的是为了提高缓存的命中率 ...
- Java原子操作类汇总
当程序更新一个变量时,如果是多线程同时更新这个变量,可能得到的结果与期望值不同.比如:有一个变量i,A线程执行i+1,B线程也执行i+1,经过两个线程的操作后,变量i的值可能不是期望的3,而是2.这是 ...
- webpack快速入门——Json配置文件使用
在实际工作中,我们的项目都会配置一个Json的文件或者说API文件,作为项目的配置文件. 有时候你也会从后台读取到一个json的文件,这节课就学习如何在webpack环境中使用Json. 如果你会we ...
- PHP之旅4 php 超全局变量
预定义数组: 自动全局变量---超全局数组 1.包含了来自web服务器,客户端,运行环境和用户输入的数据 2.这些数组比较特别 3.全局范围内自动生效,都可以直接使用这些数组 4.用户不能自定义这些数 ...