如何检查两个XML文件是否与Python等效?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了如何检查两个XML文件是否与Python等效?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1748字,纯文字阅读大概需要3分钟。
内容图文
如何检查两个XML文件是否相同?
例如,即使排序不同,两个XML文件也是相同的.我需要检查两个XML文件是否包含相同的文本信息,而忽略了订单.
<a>
<b>hello</b>
<c><d>world</d></c>
</a>
<a>
<c><d>world</d></c>
<b>hello</b>
</a>
那里有工具吗?
解决方法:
这一切都取决于你对“等效”的定义.
假设你真的只关心文本节点(例如:你的例子中的d标记甚至不重要,你只关心内容词),你可以只做一组每个文档的文本节点,并比较集.使用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())
请注意,使用集合意味着您不会考虑文档中某些文本出现的次数(这可能是您想要的,也可能不是).如果顺序不重要,但事件发生的次数是,您可以使用字典而不是集合,并跟踪出现的次数(例如,使用collections.defaultdict()或collections.Counter在python 2.7中)
但是如果它只是根元素的直接子元素的顺序(在你的情况下,一个元素的子元素)可以被忽略,并且这些元素中的所有内容都很重要,那么你需要另一种方法.例如,您可以对每个子元素执行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的开发版本,在旧版本中,etree.tostring()没有method =’c14n’,只有ElementTree上的c14n()方法,写入一个类似文件的对象.因此,为了让它在那里工作,你必须将每个元素复制到它自己的树,并使用StringIO()对象作为虚拟文件)
此外,对于非常大的文件,可能不建议这样做.
但同样:一个大警告:你真的必须知道你需要什么“等同”,并根据这些知识创建自己的解决方案!
内容总结
以上是互联网集市为您收集整理的如何检查两个XML文件是否与Python等效?全部内容,希望文章能够帮你解决如何检查两个XML文件是否与Python等效?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。