XML解析:Element Tree(etree)与minidom
我已经用minidom解析XML很多年了。现在我突然了解到Element Tree。我的问题是,哪一个在解析上更好呢?也就是说:
- 哪个更快?
- 哪个占用的内存更少?
- 这两个有没有让我需要担心的O(n^2)的依赖关系?
- 有没有哪个正在被淘汰,换成另一个?
为什么我们会有两个接口呢?
谢谢。
2 个回答
21
DOM和Sax接口是处理XML的传统方法。Python提供这些接口是因为它们是大家都熟悉的标准。
ElementTree这个包是为了提供一种更符合Python风格的接口。它的目标就是让程序员的工作变得更简单。
根据你的Python版本,这些接口背后都有用C语言实现的部分,这样可以让它们运行得更快。
以上提到的工具都不会被淘汰。它们各自都有优点,比如Sax不需要把所有输入都读到内存里。
还有一个叫做 lxml 的第三方模块,它也是一个很受欢迎的选择(功能齐全且运行快速)。
17
Python有两个接口,可能是因为Element Tree这个功能是在minidom之后才被加入到标准库里的。这样做的原因可能是因为Element Tree的使用方式更符合Python的风格,相比之下,W3C控制的DOM就显得不那么友好了。
如果你在乎速度的话,还有一个叫做 lxml 的库,它使用libxml2来构建一个兼容ElementTree的DOM,速度应该会很快。他们还有一个基准测试,可以把自己和ElementTree在Python和C语言下的实现进行比较。
如果你担心内存使用,那其实就不应该用树形API了;这时候PullDOM可能是个更好的选择。不过我只是根据自己使用Java的优秀pull解析器的经验来推测的,目前关于PullDOM的信息似乎不多。