Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 import os, sys, subprocess, platform
00028 import lxml.etree as le
00029 from operator import attrgetter
00030
00031
00032
00033 def createFileObj(prefix, name):
00034 return {
00035 "filename" : os.path.abspath(name),
00036 "tmpfilename" : "." + prefix + "." + os.path.basename(name)
00037 }
00038
00039
00040
00041
00042 def sortbytext(elem):
00043 text = elem.text
00044 if text:
00045 return text
00046 else:
00047 return ''
00048
00049 def sortbytag(elem):
00050 keys = [elem.tag]
00051 for key in sorted(elem.keys()):
00052 keys.append(elem.get(key))
00053 return keys
00054
00055
00056
00057
00058
00059 def sortAttrs(item, sorteditem):
00060 attrkeys = sorted(item.keys())
00061 for key in attrkeys:
00062 sorteditem.set(key, item.get(key))
00063
00064
00065
00066
00067
00068
00069
00070 def sortElements(items, newroot):
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082 items = sorted(items, key=sortbytext)
00083 items = sorted(items, key=sortbytag)
00084
00085
00086 for item in items:
00087
00088
00089 newitem = le.Element(item.tag)
00090 if item.text and item.text.isspace() == False:
00091 newitem.text = item.text
00092
00093
00094 sortAttrs(item, newitem)
00095
00096
00097 sortElements(list(item), newitem)
00098
00099
00100 newroot.append(newitem)
00101
00102
00103
00104
00105
00106
00107 def sortFile(fileobj):
00108 with open(fileobj['filename'], 'r') as original:
00109
00110 xmldoc = le.parse(original)
00111 xmlroot = xmldoc.getroot()
00112
00113
00114
00115 newxmlroot = le.Element(xmlroot.tag)
00116
00117
00118 sortAttrs(xmlroot, newxmlroot)
00119 sortElements(list(xmlroot), newxmlroot)
00120
00121
00122 newtree = le.ElementTree(newxmlroot)
00123 with open(fileobj['tmpfilename'], 'wb') as newfile:
00124 newtree.write(newfile, pretty_print=True)
00125
00126
00127
00128
00129 def compareFiles(filename1, filename2):
00130 filefrom = createFileObj("from", filename1)
00131 sortFile(filefrom)
00132 fileto = createFileObj("to", filename2)
00133 sortFile(fileto)
00134
00135
00136
00137 if platform.system() == "Windows":
00138 sp = subprocess.Popen([ "cmd", "/c", 'diff ' + filefrom['tmpfilename'] + " " + fileto['tmpfilename'] ], stdout=subprocess.PIPE, shell=True)
00139 else:
00140 sp = subprocess.Popen([ 'diff ' + os.path.abspath(filefrom['tmpfilename']) + " " + os.path.abspath(fileto['tmpfilename']) ], stdout=subprocess.PIPE, shell=True)
00141 stdout = sp.communicate()[0]
00142
00143
00144
00145 os.remove(filefrom['tmpfilename'])
00146 os.remove(fileto['tmpfilename'])
00147 return stdout