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 模块时,第一步是设置树的根元素。 每个元素都有一个标签和属性,它是一个字典对象。 对于根元素,属性是一个空字典。
import xml.etree.ElementTree as xmlobj root=xmlobj.Element('studentList')
现在,我们可以在根元素下添加一个或多个元素。 每个元素对象可能有子元素。 每个子元素都有一个属性和文本属性。
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')
tree 对象有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 的 ContentHandler。 您可以为感兴趣的事件注册回调,然后让解析器处理文档。
当您的文档很大或内存有限制时,SAX 很有用,因为它在从磁盘读取文件时解析文件,因此整个文件永远不会存储在内存中。
文档对象模型
(DOM) API 是万维网联盟的推荐。 在这种情况下,整个文件被读入内存并以分层(基于树的)形式存储,以表示 XML 文档的所有功能。
SAX,速度不如 DOM,但文件较大。 另一方面,如果在许多小文件上使用,DOM 会消耗资源。 SAX 是只读的,而 DOM 允许对 XML 文件进行更改。