XML解析:Element Tree(etree)与minidom

34 投票
2 回答
23922 浏览
提问于 2025-04-17 05:42

我已经用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的信息似乎不多。

撰写回答