【问题标题】:Getting DOM tree of XML document获取 XML 文档的 DOM 树
【发布时间】:2009-08-18 15:31:03
【问题描述】:

有谁知道我将如何在 Python 中获取 XML 文件的 DOM 实例(树)。我正在尝试将两个可能具有不同顺序的元素和属性的 XML 文档相互比较。我该怎么做?

【问题讨论】:

    标签: python xml dom


    【解决方案1】:

    就个人而言,只要有可能,我会从elementtree 开始(最好是Python 标准库附带的C 实现,或者lxml 实现,但这本质上只是一个更高的速度问题)。它不是一个符合标准的 DOM,但以更 Pythonic 和更方便的方式保存相同的信息。您可以从调用xml.etree.ElementTree.parse 开始,它获取XML 源并返回一个元素树;在两个源上都这样做,在每个元素树上使用getroot 来获取它的根元素,然后从根元素开始递归地比较元素。

    元素的子元素形成一个序列,在元素树中就像在标准 DOM 中一样,这意味着它们的顺序很重要;但是很容易从它们中制作 Python 集(或者如果在您的用例中重复很重要,尽管顺序不重要,则需要更多的努力“多集”)以进行更宽松的比较。给定元素的属性更容易,其中唯一性得到保证,顺序在语义上不相关。

    您是否需要一个标准的 DOM 而不是像元素树这样的替代容器,或者您只是在一般意义上使用术语 DOM 以便元素树就可以了?

    在过去,我使用PyRXP 也取得了不错的效果,它使用比 ElementTree 更明显和更简单的表示。然而,那是多年前的事了。对于今天的 PyRXP 与 lxml 或 cElementTree 的比较,我没有最近的经验。

    【讨论】:

      【解决方案2】:

      一些值得思考的解决方案:

      【讨论】:

      • 我查看了 minidom,文档中没有任何关于如何从已解析文件中获取 DOM 树的信息。我想比较两棵树,所以顺序无关紧要。你知道怎么做吗?
      • Python 2.6 中的 minidom 文档给出了一个从 xml.dom.minidom import parse, parseString dom1 = parse('c:\\ temp\\mydata.xml') # 按名称解析 XML 文件
      【解决方案3】:

      为了比较 XML 文档实例,简单地比较已解析的 DOM 树是行不通的。您可能需要实现自己的 NodeComperator,它会根据您的特定标准递归地将节点及其子节点与其他节点及其子节点进行比较,例如:

      • 子元素的顺序何时重要?
      • 文本内容中的空白何时重要?
      • 某些元素是否有默认值?您的解析器是否应用了这些默认值?
      • 是否应扩展实体引用以进行比较

      Minidom 是解析文件的良好起点,并且易于使用。但是,您的特定应用程序的比较功能的实际实现需要您自己完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-28
        • 1970-01-01
        • 2011-11-10
        • 2013-02-06
        • 2014-08-19
        • 1970-01-01
        • 2011-05-19
        • 2020-12-30
        相关资源
        最近更新 更多