获取XML文档的DOM树
有没有人知道我怎么能在Python中获取一个XML文件的DOM实例(树形结构)?我想比较两个XML文档,它们的元素和属性可能顺序不同。我该怎么做呢?
3 个回答
在比较XML文档时,简单地对比解析后的DOM树是行不通的。你可能需要自己实现一个节点比较器(NodeComperator),这个比较器要能递归地比较一个节点及其子节点,和另一个节点及其子节点。比较的标准可以根据你的具体需求来定,比如:
- 子元素的顺序什么时候是重要的?
- 文本内容中的空格什么时候是重要的?
- 某些元素是否有默认值,这些默认值是否被你的解析器应用了?
- 在比较时,实体引用是否需要展开?
Minidom 是解析文件的一个不错的起点,而且使用起来很简单。不过,具体的比较函数实现还是得由你自己来完成。
个人来说,只要有机会,我会选择从 elementtree 开始(最好是Python标准库里自带的C实现,或者是 lxml 实现,不过这主要是因为速度更快)。它虽然不是标准的DOM,但以更符合Python风格和更方便的方式存储相同的信息。你可以通过调用 xml.etree.ElementTree.parse
来开始,这个方法会接收XML源文件并返回一个元素树;对两个源文件都这样做,然后用 getroot
方法获取每个元素树的根元素,接着从根元素开始递归比较元素。
元素的子元素形成一个序列,在元素树中和标准DOM一样,这意味着它们的顺序是很重要的;不过,把它们转成Python集合是很简单的(如果你的需求中顺序不重要,但重复出现的元素重要的话,可以稍微费点劲做成“多重集合”)。对于某个元素的属性来说,情况更简单,因为属性是唯一的,顺序在语义上并不重要。
你是否有特别的原因需要标准的DOM,而不是像元素树这样的替代容器,还是说你只是一般性地使用DOM这个词,所以元素树也可以接受?
过去我也用过 PyRXP,效果不错,它的表示方式比ElementTree更简单明了。不过,那是很多年前的事了;我对现在的PyRXP和lxml或cElementTree的比较没有最新的经验。