gpt4 book ai didi

python - 如何检查这两个 XML 文件是否与 Python 等效?

转载 作者:数据小太阳 更新时间:2023-10-29 02:18:12 31 4
gpt4 key购买 nike

如何检查两个 XML 文件是否等价?

例如,尽管顺序不同,但两个 XML 文件是相同的。我需要检查这两个 XML 文件是否包含相同的文本信息而不考虑顺序。

<a>
<b>hello</b>
<c><d>world</d></c>
</a>

<a>
<c><d>world</d></c>
<b>hello</b>
</a>

有没有这方面的工具?

最佳答案

这完全取决于您对“等效”的定义。

假设你真的只关心文本节点(例如:你的例子中的 d 标签根本不重要,你只关心内容 word ),你可以只做一组文本节点每个文件,并比较集。使用 lxml,这可能看起来像:

from lxml import etree

tree1 = etree.parse('example1.xml')
tree2 = etree.parse('example2.xml')

print set(tree1.getroot().itertext()) == set(tree2.getroot().itertext())

您甚至可能想忽略空白节点,执行如下操作:

set(i for i in tree.getroot().itertext() if i.strip())

请注意,使用集合意味着您不会考虑文档中某些文本出现的次数(这可能是您想要的,也可能不是)。如果顺序不重要,但某事发生的次数很重要,则可以使用字典而不是集合,并跟踪出现的次数(例如,在 python 2.7 中使用 collections.defaultdict()collections.Counter)

但是,如果只有根元素的直接子元素(在您的例子中是 a 元素的子元素)的顺序可能会被忽略,而这些元素中的所有内容确实很重要,那么您将需要另一种方法.例如,您可以对每个子元素执行 xml 规范化以获得每个子元素的规范化版本(同样,我不知道这是否规范化足以满足您的需要)。

from lxml import etree

tree1 = etree.parse('example1.xml')
tree2 = etree.parse('example2.xml')

set1 = set(etree.tostring(i, method='c14n') for i in tree1.getroot())
set2 = set(etree.tostring(i, method='c14n') for i in tree2.getroot())

print set1 == set2

注意:为了让示例更简单,我使用了 lxml 的开发版本,在旧版本中,没有 method='c14n'对于 etree.tostring() , 只有一个 c14n() ElementTree 上的方法,它写入类似文件的对象。所以要让它在那里工作,你必须将每个元素复制到它自己的树中,并使用 StringIO()对象作为虚拟文件)

此外,对于非常大的文件,可能不推荐使用这种方法。

但再次提醒:一个重要警告:您真的必须知道需要什么作为“等效”,并根据这些知识创建您自己的解决方案!

关于python - 如何检查这两个 XML 文件是否与 Python 等效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3978068/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com