获取XML文档的DOM树

时间:2009-08-18 15:31:03

标签: python xml dom

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

3 个答案:

答案 0 :(得分:2)

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

元素的子元素在元素树中形成序列,就像在标准DOM中一样,意味着它们的顺序被认为是重要的;但是很容易让Python设置出来(或者稍微努力一些“多组”,如果重复在你的用例中很重要,虽然顺序不是这样)进行较宽松的比较。对于给定元素的属性来说,它更加容易,其中唯一性得到保证,订单在语义上不相关。

是否有某些特定的原因需要标准DOM而不是像元素树那样的替代容器,或者您只是在一般意义上使用术语DOM,以便元素树可以正常使用?

过去我使用PyRXP也取得了不错的效果,它使用比ElementTree更加简单明了的表示。然而,它是多年前的事情;我最近没有关于PyRXP如何与lxml或cElementTree进行比较的经验。

答案 1 :(得分:1)

一些思考的解决方案:

答案 2 :(得分:0)

为了比较XML文档实例,解析的DOM树的天真比较将不起作用。您可能需要实现自己的NodeComperator,它根据您的特定条件递归地将节点及其子节点与其他节点及其子节点进行比较,例如:

  • 子元素的顺序何时显着?
  • 文本内容中的空格何时显着?
  • 某些元素是否有默认值,是否由解析器应用?
  • 应扩展实体引用以进行比较

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