Python解析XML的几种方法

51 sec read

Python 有非常非常多的工具来处理 XML。哪个工具易用性更好,性能更加?一起来探索下。

xml.dom.* 模块

xml.dom实现的是W3C制定的DOM API。如果你习惯于使用DOM API,可以使用这个包。xml.dom将XML数据在内存中解析成一个树,通过对树的操作来操作XML。一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

注意:在 xml.dom 包里面有许多模块,注意它们之间的不同。

  • dom.minidom是DOM API的极简化实现,比完整版的DOM要简单的多,而且这个包也小的多。
  • dom.pulldom模块提供的是一个“pull解析器”,其背后的基本概念指的是从XML流中pull事件,然后进行处理。

更多参考:https://docs.python.org/2/library/xml.dom.html

xml.sax.* 模块

xml.sax.* 模块是 SAX API 的实现。这个模块牺牲了便捷性来换取速度和内存占用。SAX(simple API for XML),是基于事件处理的,当XML文档顺序地读入时,每次遇到一个元素会触发相应的事件处理函数来处理。

SAX的特点:

  • 是基于事件的 API
  • 在一个比 DOM 低的级别上操作
  • 为您提供比 DOM 更多的控制
  • 几乎总是比 DOM 更有效率
  • 但不幸的是,需要比 DOM 更多的工作

使用Python解析XML的时候,需要 import xml.sax 和 xml.sax.handler

更多参考:https://docs.python.org/2/library/xml.sax.html

xml.parser.expat

xml.parser.expat提供了对C语言编写的expat解析器的一个直接的、底层API接口。expat接口与SAX类似,也是基于事件回调机制,但是这个接口并不是标准化的,只适用于expat库。

更多参考:https://docs.python.org/2/library/pyexpat.html

ElementTree

xml.etree.ElementTree模块提供了一个轻量级、Pythonic的API,同时还有一个高效的C语言实现,即xml.etree.cElementTree。与DOM相比,ET的速度更快,API使用更直接、方便。与SAX相比,ET.iterparse函数同样提供了按需解析的功能,不会一次性在内存中读入整个文档。ET的性能与SAX模块大致相仿,但是它的API更加高层次,用户使用起来更加便捷。

ElementTree在 Python 标准库中有两种实现。一种是纯 Python 实现例如 xml.etree.ElementTree ,另外一种是速度快一点的 xml.etree.cElementTree 。你要记住: 尽量使用 C 语言实现的那种,因为它速度更快,而且消耗的内存更少。

Element对象

ElementTree对象

模块方法

更多参考:

xmltodict

xmltodict是一个可以让你在处理XML时感觉像在处理JSON一样的Python模块。

对于一个像这样的XML文件:

可以装载进一个Python字典里,像这样:

你可以访问元素,属性以及值,像这样:

xmltodict 也有unparse函数让你可以转回XML。该函数有一个streaming模式适合用来 处理不能放入内存的文件,它还支持命名空间。

更多信息:https://github.com/martinblech/xmltodict

untangle

untangle 库可以将XML文档映射为一个Python 对象,该对象于其结构中包含了原文档的节点与属性信息。

作为例子,一个像这样的XML文件:

可以被这样载入:

然后你可以像这样获取child元素名称:

untangle也支持从字符串或URL中载入XML。

更多信息:https://github.com/stchris/untangle

lxml

具体参看:数据提取工具lxml及xpath

BeautifulSoup

具体参看:Python数据解析工具:Beautiful Soup

总结:在不考虑性能的情况下,我选择的是xmltodict,方便易用。如果考虑性能,建议使用ElementTree。

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

C语言学习:size_t

在学习C语言的时候,遇到了一个新的数据类型size_t,截止目前也没有完全理清这个类似的具体场景及出现的原因。
44 sec read

C语言学习:main()函数的正确写法

C语言虽然是一门古老的语言,但是其标准一直在完善,所以很多以前支持的语法在到当前已经不能在使用了。 C语言的版
41 sec read

Scipy数学函数的Scala实现

最近在推进项目的时候,遇到需要将线下的Python代码转化成线上的集群代码,由于机器代码环境是Scala,所以
4 min read

发表评论

电子邮件地址不会被公开。 必填项已用*标注