Python数据持久性 XML解析器
XML是 eXtensible Markup Language 的首字母缩写 。 它是一种可移植的、开源的、跨平台的语言,非常像HTML或SGML,并由万维网联盟推荐。
它是一种著名的数据交换格式,被大量的应用程序使用,如网络服务、办公工具和 面向服务的架构 (SOA)。XML格式既是机器可读的,也是人类可读的。
标准Python库的xml包由以下模块组成,用于XML处理
序号 | 模块和描述 |
---|---|
1 | xml.etree.ElementTree ElementTree API,一个简单和轻量级的XML处理器。 |
2 | xml.dom 的DOM API定义 |
3 | xml.dom.minidom 一个最小的DOM实现 |
4 | xml.sax 的SAX2接口实现 |
5 | xml.parsers.expat 绑定的Expat解析器 |
XML文档中的数据是以树状分层格式排列的,从根和元素开始。每个元素都是树中的一个节点,并有一个被<>和</>标签包围的属性。一个或多个子元素可以分配给每个元素。
以下是一个典型的XML文档的例子
<?xml version = "1.0" encoding = "iso-8859-1"?>
<studentlist>
<student>
<name>Ratna</name>
<subject>Physics</subject>
<marks>85</marks>
</student>
<student>
<name>Kiran</name>
<subject>Maths</subject>
<marks>100</marks>
</student>
<student>
<name>Mohit</name>
<subject>Biology</subject>
<marks>92</marks>
</student>
</studentlist>
在使用 ElementTree 模块时,第1步是建立树的根元素。每个元素都有一个标签和attrib,是一个dict对象。对于根元素,attrib是一个空的字典。
import xml.etree.ElementTree as xmlobj
root=xmlobj.Element('studentList')
现在,我们可以在根元素下添加一个或多个元素。每个元素对象可以有 SubElements。 每个子元素都有一个属性和文本属性。
student=xmlobj.Element('student')
nm=xmlobj.SubElement(student, 'name')
nm.text='name'
subject=xmlobj.SubElement(student, 'subject')
nm.text='Ratna'
subject.text='Physics'
marks=xmlobj.SubElement(student, 'marks')
marks.text='85'
这个新元素使用append()方法追加到根部。
root.append(student)
使用上述方法追加所需的元素。最后,根元素对象被写入一个文件。
tree = xmlobj.ElementTree(root)
file = open('studentlist.xml','wb')
tree.write(file)
file.close()
现在,我们看看如何解析XML文件。为此,构造文档树,在ElementTree构造函数中给它的名字作为文件参数。
tree = xmlobj.ElementTree(file='studentlist.xml')
树对象有 getroot() 方法来获得根元素,getchildren()方法返回它下面的元素的列表。
root = tree.getroot()
children = root.getchildren()
通过迭代每个子节点的子元素集合,构建对应于每个子元素的字典对象。
for child in children:
student={}
pairs = child.getchildren()
for pair in pairs:
product[pair.tag]=pair.text
然后每个字典被附加到一个列表上,返回字典对象的原始列表。
SAX 是一个用于事件驱动的XML解析的标准接口。用SAX解析XML需要通过子类化xml.sax.ContentHandler。你为感兴趣的事件注册回调,然后,让解析器在文档中进行。
当你的文件很大或者你有内存限制的时候,SAX是很有用的,因为它在从磁盘上读取文件的时候解析文件,结果是整个文件不会被存储在内存中。
文档对象模型
(DOM) API是万维网联盟的一项建议。在这种情况下,整个文件被读入内存,并以分层(基于树的)形式存储,以表示一个XML文档的所有特征。
SAX,不像DOM那样快,有大文件。另一方面,如果在许多小文件上使用,DOM可以杀死资源。SAX是只读的,而DOM允许对XML文件进行修改。