【问题标题】:XML Parsing: Element Tree (etree) vs. minidom [duplicate]XML 解析:元素树(etree)与 minidom [重复]
【发布时间】:2011-12-22 18:37:21
【问题描述】:

多年来,我一直在使用 minidom 解析 XML。现在我突然了解了元素树。我的问题是更好解析?那就是:

  • 哪个更快?
  • 哪个使用更少的内存?
  • 是否有任何需要担心的 O(n^2) 依赖项?
  • 是否正在贬值以支持另一个?

为什么我们有两个接口?

谢谢。

【问题讨论】:

    标签: python xml-parsing elementtree minidom


    【解决方案1】:

    Python 有两个接口可能是因为 Element Tree 在 minidom 出现之后很晚才被集成到标准库中。其原因可能是它比 W3C 控制的 DOM 更“Pythonic”的 API。

    如果您关心速度,还有lxml,它使用 libxml2 构建与 ElementTree 兼容的 DOM,并且应该非常快——他们有一个基准套件,可以与 ElementTree 的 Python 和 C 实现进行比较。

    如果您担心内存使用,则无论如何都不应该使用树 API; PullDOM 可能是更好的选择,但我是根据使用 Java 出色的 pull 解析器的经验推断的——目前关于 PullDOM 的信息似乎并不多。

    【讨论】:

      【解决方案2】:

      用于 XML 解析的 DOM 和 Sax 接口是使用 XML 的经典方法。 Python 必须提供这些接口,因为它们是众所周知且标准的。

      ElementTree 包旨在提供更 Pythonic 的界面。这一切都是为了让程序员更轻松。

      根据您的构建,它们中的每一个都有一个底层 C 实现,使它们运行得更快。

      以上工具均未弃用。它们各有优点(例如,Sax 不需要将整个输入读入内存)。

      还有一个名为lxml 的第三方模块,这也是一个流行的选择(功能齐全且速度快)。

      【讨论】:

      • 如果您对元素有性能问题,可以使用 lxml,它提供了兼容的接口,但在后台使用了久经考验、高度优化的 C 库。
      • ElementTree 是“更多 Pythonic”,主要是因为您说 myNode[3] 而不是 myNode.childNodes[3] 来获取第二个孩子。调整任何 DOM 实现都需要 2 行代码,因此您可以做同样的事情。更重要的是,ElementTree 对待文本内容的方式与几乎所有其他工具都大不相同,并使一些常见任务变得更加困难。例如,要收集所有文本,您不仅要递归,还要从每个节点中获取 2 属性(元素开头的文本与子元素之后的文本存储方式不同! )
      猜你喜欢
      • 2020-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2015-02-18
      • 2015-05-31
      • 1970-01-01
      相关资源
      最近更新 更多