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

如何在脚本中比较python中的两个xml文件?,python,xml,file,python-2.7,filecompare,Python,Xml,File,Python 2.7,Filecompare,我是新来的蟒蛇。我有一些预定义的xml文件。我有一个生成新xml文件的脚本。我想写一个自动脚本来比较xmls文件,并在输出文件中存储不同xml文件名的名称? 提前谢谢我想您正在寻找合适的人选。您可以这样使用它: import filecmp cmp = filecmp.cmp('f1.xml', 'f2.xml') # Files are equal if cmp: continue else: out_file.write('f1.xml') 用您的xml文件替换f1.x

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

我想您正在寻找合适的人选。您可以这样使用它:

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

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

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

我想您正在寻找。您可以这样使用它:

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

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

用xml文件替换
f1.xml
f2.xml

基于@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()

基于@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()

你说的是按字节比较还是语义平等? (是否
等于
?) 如果您想检查语义平等性,请查看

在生成xml时,尤其是对属性使用普通dict时,属性顺序可能会混淆,即使有时使用相同的脚本和相同的输入

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


你说的是按字节比较还是语义平等? (是否
等于
?) 如果您想检查语义平等性,请查看

在生成xml时,尤其是对属性使用普通dict时,属性顺序可能会混淆,即使有时使用相同的脚本和相同的输入

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


下面的代码段怎么样:

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

下面的代码段怎么样:

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

多了解一些情况会很有用。您是从文件名列表开始,还是从文件所在的目录开始?您想比较文件是否在文本上完全相同(简单),还是仅仅是xml数据相同(更复杂)?是否要将每个文件与其他文件进行比较,并生成不相同的所有文件对的列表?还是将它们全部比较为一个文件?或者您只是想要一个比较任意两个xml文件的函数吗?我有一对xml文件,我预定义了一个,另一个脚本生成了一个。我想编写一个脚本或函数,它将获取源XML和目标XML的路径,并对它们进行比较。如果两个文件内容相同,则移动到下一个文件对;否则,如果XML内容不相同,则将目标XML路径存储在输出文件中。稍微增加一点上下文将非常有用。您是从文件名列表开始,还是从文件所在的目录开始?您想比较文件是否在文本上完全相同(简单),还是仅仅是xml数据相同(更复杂)?是否要将每个文件与其他文件进行比较,并生成不相同的所有文件对的列表?还是将它们全部比较为一个文件?或者您只是想要一个比较任意两个xml文件的函数吗?我有一对xml文件,我预定义了一个,另一个脚本生成了一个。我想编写一个脚本或函数,它将获取源XML和目标XML的路径,并对它们进行比较。如果两个文件内容相同,则移动到下一个文件对;如果XML内容不相同,则将目标XML路径存储在输出文件中