问题描述
我想比较 2 个格式相似的 xml 文件。
示例f1.xml
:
<apple name="a" mb="15" lb="0" write="true" value="1"/>
<apple name="b" mb="31" lb="16" write="true" value="2"/>
<apple name="c" mb="32" lb="32" write="true" value="3"/>
示例f2.xml
:
<apple name="a" mb="15" lb="0" write="true" value="1"/>
<apple name="b" mb="31" lb="16" write="true" value="3"/>
<apple name="c" mb="32" lb="32" write="true" value="2"/>
如果同一个苹果名称的值不同,我想逐行比较并打印出来。
我怎么能用 Python 做到这一点?
1楼
首先,您需要通过给它一个根元素来使您的 xml 成为有效的 xml。
然后使用 lxml 解析它。
然后使用您喜欢的任何功能比较它们。
这个例子并不是完成它的最短方法,但它确实以一种显示您可以使用的许多不同功能的方式对其进行了分解。
from lxml import etree
def dem_apples(xml1,xml2,join_on='name'):
tree1 = etree.fromstring(xml1)
tree2 = etree.fromstring(xml2)
for a1 in tree1.xpath('./apple'):
a1_attr_set = set(dict(a1.attrib).items())
a2_list = tree2.xpath('./apple[@{0}="{1}"]'.\
format(join_on,a1.get(join_on)))
for a2 in a2_list:
a2_attr_set = set(dict(a2.attrib).items())
diff = a1_attr_set - a2_attr_set
if diff:
print(a1.get(join_on),diff,a2_attr_set-a1_attr_set)
if __name__ == '__main__':
xml_string1="""
<fruit>
<apple name="a" mb="15" lb="0" write="true" value="1"/>
<apple name="b" mb="31" lb="16" write="true" value="2"/>
<apple name="c" mb="32" lb="32" write="true" value="3"/>
</fruit>
"""
xml_string2="""
<fruit>
<apple name="a" mb="15" lb="0" write="true" value="1"/>
<apple name="b" mb="31" lb="16" write="true" value="3"/>
<apple name="c" mb="32" lb="32" write="true" value="2"/>
</fruit>
"""
dem_apples(xml_string1,xml_string2)