我是新蟒蛇。我有一些预定义的 xml 文件。我有一个生成新 xml 文件的脚本。我想编写一个自动脚本来比较 xmls 文件并将不同 xml 文件名的名称存储在输出文件中?提前致谢
			
			11356 次
		
4 回答
            2        
        
		
我认为您正在寻找filecmp模块。你可以像这样使用它:
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
于 2013-08-08T05:22:31.953   回答
    
    
            2        
        
		
您是说按字节比较它们还是语义相等?(<tag attr1="1" attr2="2" />等于<tag attr2="2"     attr1="1" />?)如果您想检查语义相等性,请查看Python 中的 Xml 比较
在生成 xml 时,特别是如果在某处为属性使用普通字典时,即使有时您使用具有相同输入的相同脚本,属性顺序也会混淆。
项目()
...
CPython 实现细节:键和值以非随机的任意顺序列出,在 Python 实现中有所不同,并且取决于字典的插入和删除历史。
于 2015-09-25T18:51:01.570   回答
    
    
            0        
        
		
基于@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()
于 2013-08-08T05:37:16.027   回答
    
    
            0        
        
		
下面的代码片段怎么样:
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
于 2017-05-18T12:16:04.227   回答