📜  Python数据持久性-XML解析器

📅  最后修改于: 2020-11-07 08:25:49             🧑  作者: Mango


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

它是一种众所周知的数据交换格式,被大量应用程序使用,例如Web服务,办公工具和面向服务的体系结构(SOA)。 XML格式是机器可读和人类可读的。

标准Python库的xml软件包包含以下用于XML处理的模块-

Sr.No. Modules & Description
1

xml.etree.ElementTree

the ElementTree API, a simple and lightweight XML processor

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文档的典型示例-



   
      Ratna
      Physics
      85</marks>
   
   
      Kiran
      Maths
      100
   
   
      Mohit
      Biology</subject>
      92
   

在使用ElementTree模块时,第一步是设置树的根元素。每个元素都有一个标签和attrib,这是一个dict对象。对于根元素,属性是一个空字典。

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,则DOM可能会杀死资源。 SAX是只读的,而DOM允许更改XML文件。