繁体   English   中英

如何在脚本中比较python中的两个xml文件?

[英]How to compare two xml files in python in script?

我是新蟒蛇。 我有一些预定义的xml文件。 我有一个生成新的xml文件的脚本。 我想编写一个比较xmls文件并在输出文件中存储不同xml文件名的自动脚本吗? 提前致谢

我认为您正在寻找filecmp模块 您可以像这样使用它:

import filecmp
cmp = filecmp.cmp('f1.xml', 'f2.xml')

# Files are equal
if cmp:
    continue
else:
    out_file.write('f1.xml') 

用您的xml文件替换f1.xmlf2.xml

您是在按字节比较还是在语义相等方面进行比较? <tag attr1="1" attr2="2" />等于<tag attr2="2" attr1="1" />吗?)如果要检查语义相等性,请查看Python中的Xml比较

当生成xml时,尤其是在某些情况下对属性使用常规dict的情况下,即使有时使用相同的脚本和相同的输入,有时也会混淆属性顺序。

items()

...

CPython实现细节:键和值以任意顺序列出,该顺序是非随机的,在Python实现中会有所不同,并且取决于字典的插入和删除历史。

以@Xaranke的答案为基础:

import filecmp

out_file = open("diff_xml_names.txt")
# Not sure what format your filenames will come in, but here's one possibility.
filePairs = [('f1a.xml', 'f1b.xml'), ('f2a.xml', 'f2b.xml'), ('f3a.xml', 'f3b.xml')]

for f1, f2 in filePairs:
    if not filecmp.cmp(f1, f2):
        # Files are not equal
        out_file.write(f1+'\n')

out_file.close()

那么以下代码片段呢?

def separator(self):
    return "!@#$%^&*" # Very ugly separator

def _traverseXML(self, xmlElem, tags, xpaths):
    tags.append(xmlElem.tag)
    for e in xmlElem:
        self._traverseXML(e, tags, xpaths)

    text = ''
    if (xmlElem.text):
        text = xmlElem.text.strip()

    xpaths.add("/".join(tags) + self.separator() + text)
    tags.pop()

def _xmlToSet(self, xml):
    xpaths = set() # output
    tags = list()
    root = ET.fromstring(xml)
    self._traverseXML(root, tags, xpaths)

    return xpaths

def _areXMLsAlike(self, xml1, xml2):
    xpaths1 = self._xmlToSet(xml1)
    xpaths2 = self._xmlToSet(xml2)

    return xpaths1 == xpaths2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM