Python 数据持久性 - XML 解析器


XML 是可扩展标记语言的缩写。它是一种可移植、开源和跨平台语言,非常类似于 HTML 或 SGML,并受到万维网联盟的推荐。

它是一种众所周知的数据交换格式,被大量应用程序使用,例如 Web 服务、办公工具和面向服务的架构(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模块时,第一步是设置树的根元素。每个元素都有一个标签和 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 来实现 ContentHandler。您注册感兴趣事件的回调,然后让解析器继续处理文档。

当您的文档很大或有内存限制时,SAX 非常有用,因为它会在从磁盘读取文件时解析文件,因此整个文件永远不会存储在内存中。

文档对象模型

(DOM) API 是万维网联盟的推荐标准。在这种情况下,整个文件被读入内存并以分层(基于树)的形式存储,以表示 XML 文档的所有功能。

SAX,速度不如 DOM,文件较大。另一方面,如果在许多小文件上使用 DOM,则可能会杀死资源。SAX 是只读的,而 DOM 允许更改 XML 文件。