获取XML文档的DOM树

5

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

3个回答

2
个人而言,尽可能地,我会从elementtree开始(最好是Python标准库附带的C实现或lxml实现,但这只是速度更快的问题)。它不是符合标准的DOM,但以更加Pythonic和方便的方式保存相同的信息。您可以通过调用xml.etree.ElementTree.parse来开始,该方法接受XML源并返回一个元素树;在两个源上都执行此操作,使用getroot在每个元素树上获取其根元素,然后从根元素开始递归比较元素。
元素的子项在元素树中形成序列,就像在标准DOM中一样,这意味着它们的顺序被认为很重要;但是,对于它们,很容易将它们转换为Python集合(如果重复在您的用例中很重要,但顺序不重要,则需要进行一些更多的努力来创建某种“多集”)。对于给定元素的属性,甚至更容易,其中确保唯一性且语义上不相关的顺序。
您是否需要标准DOM而不是像元素树这样的替代容器,或者您只是在一般情况下使用DOM术语,因此元素树可以使用?
过去,我还使用PyRXP取得了良好的结果,它使用的表示比ElementTree甚至更简单。但是,那是很多年前的事了;我没有最近的经验来比较PyRXP今天与lxml或cElementTree的差异。

1

以下是几个值得思考的解决方案:


我已经查看了minidom,但文档中没有关于如何从解析文件获取DOM树的信息。我想比较两个树,使得顺序无关紧要。你有任何想法吗? - Dave
Python 2.6中的minidom文档提供了一个从文件获取DOM的示例(您需要其他内容吗)from xml.dom.minidom import parse, parseString dom1 = parse('c:\\temp\\mydata.xml') #通过名称解析XML文件 - mmmmmm

0
比较XML文档实例时,解析DOM树的朴素比较方法将无法工作。你可能需要实现自己的NodeComperator,根据特定的标准递归地比较节点及其子节点与某些其他节点及其子节点,例如:
  • 子元素顺序何时重要?
  • 文本内容中的空格何时重要?
  • 某些元素是否具有默认值,并且您的解析器是否应用它们?
  • 在比较中应该扩展实体引用吗?

Minidom是解析文件的良好起点,易于使用。但是,对于特定应用程序的比较函数的实际实现需要由您完成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接