Python Data Persistence 简明教程
Python Data Persistence - XML Parsers
XML 是 eXtensible Markup Language 的首字母缩写。它是一种便携式、开放源码且跨平台的语言,非常类似于 HTML 或 SGML,并且得到万维网联盟的推荐。
它是一种众所周知的用于大量应用程序(例如 Web 服务、办公工具和 Service Oriented Architectures (SOA))的数据交换格式。XML 格式机器可读且人类可读。
标准 Python 库的 XML 包包含以下用于处理 XML 的模块:
Sr.No. |
Modules & Description |
1 |
xml.etree.ElementTree ElementTree API,它是一个简单轻量的 XML 处理器 |
2 |
xml.dom the DOM API definition |
3 |
xml.dom.minidom a minimal DOM implementation |
4 |
xml.sax SAX2 interface implementation |
5 |
xml.parsers.expat the Expat parser binding |
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')
现在,我们可以在根元素下添加一个或多个元素。每个元素对象可能具有 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 进行子类化来使用 ContentHandler。您注册针对感兴趣的事件的回调,然后让解析器继续处理文档。
SAX 在文档较大或存在内存限制的情况下非常有用,因为它在磁盘读取文件时会对其进行解析,因此整个文件永远不会存储在内存中。