pythonhtml内容比较_(python功能定制)复杂的xml文件对比,产生HTML展示区别

1 #coding=utf-8

2 importre3 import xml.etree.ElementTree as ET #解析xml的库

4 import difflib #文件对比库

5 import datetime #时间库

6 import platform #获取系统的库window、linux...

7 importos8 from robot.api import logger #不需要的话可以注释掉:robot framework框架脚本运行时会产生日志,可以利用这个库定制log

9

10 #listafter:将解析后的xml,转换成按序排列的list:(tag,attrib,(tag,attrib,text))

11 #此方法是被下面一个方法xmltolist()调用的,想知道具体结果,可以使用下面的方法打印解析后的结果

12 deflistafter(listcom1):13 listcomarr1 =[]14 text1 =[]15 listcomarr1.append(listcom1.tag)16 listcomarr1.append(listcom1.attrib)17 if len(listcom1) >0:18 for listcom2 inlistcom1:19 listcomarr2 =[]20 text2 =[]21 listcomarr2.append(listcom2.tag)22 listcomarr2.append(listcom2.attrib)23 if len(listcom2) >0:24 for listcom3 inlistcom2:25 listcomarr3 =[]26 text3 =[]27 listcomarr3.append(listcom3.tag)28 listcomarr3.append(listcom3.attrib)29 if len(listcom3) >0:30 for listcom4 inlistcom3:31 listcomarr4 =[]32 text4 =[]33 listcomarr4.append(listcom4.tag)34 listcomarr4.append(listcom4.attrib)35 if len(listcom4) >0:36 for listcom5 inlistcom4:37 listcomarr5 =[]38 text5 =[]39 listcomarr5.append(listcom5.tag)40 listcomarr5.append(listcom5.attrib)41 if len(listcom5) >0:42 for listcom6 inlistcom5:43 listcomarr6 =[]44 text6 =[]45 listcomarr6.append(listcom6.tag)46 listcomarr6.append(listcom6.attrib)47 if len(listcom6) >0:48 for listcom7 inlistcom6:49 listcomarr7 =[]50 text7 =[]51 listcomarr7.append(listcom7.tag)52 listcomarr7.append(listcom7.attrib)53 if len(listcom7) >0:54 for listcom8 inlistcom7:55 listcomarr8 =[]56 text8 =[]57 listcomarr8.append(listcom8.tag)58 listcomarr8.append(listcom8.attrib)59 if len(listcom8) >0:60 for listcom9 inlistcom8:61 listcomarr9 =[]62 text9 =[]63 listcomarr9.append(listcom9.tag)64 listcomarr9.append(listcom9.attrib)65 #Start:判断是否需要继续递归

66 if len(listcom9) >0:67 for listcom10 inlistcom9:68 listcomarr10 =[]69 text10 =[]70 listcomarr10.append(listcom10.tag)71 listcomarr10.append(listcom10.attrib)72 listcomarr10.append([listcom10.text])73 text9.append(listcomarr10)74 else:75 text9.append(listcom9.text)76 #End:判断是否需要继续递归

77 #list二维数组排序

78 text9 =sorted(text9)79 listcomarr9.append(text9)80 text8.append(listcomarr9)81 else:82 text8.append(listcom8.text)83 text8 =sorted(text8)84 listcomarr8.append(text8)85 text7.append(listcomarr8)86 else:87 text7.append(listcom7.text)88 text7 =sorted(text7)89 listcomarr7.append(text7)90 text6.append(listcomarr7)91 else:92 text6.append(listcom6.text)93 text6 =sorted(text6)94 listcomarr6.append(text6)95 text5.append(listcomarr6)96 else:97 text5.append(listcom5.text)98 text5 =sorted(text5)99 listcomarr5.append(text5)100 text4.append(listcomarr5)101 else:102 text4.append(listcom4.text)103 text4 =sorted(text4)104 listcomarr4.append(text4)105 text3.append(listcomarr4)106 else:107 text3.append(listcom3.text)108 text3 =sorted(text3)109 listcomarr3.append(text3)110 text2.append(listcomarr3)111 else:112 text2.append(listcom2.text)113 text2 =sorted(text2)114 listcomarr2.append(text2)115 text1.append(listcomarr2)116 else:117 text1.append(listcom1.text)118 text1 =sorted(text1)119 listcomarr1.append(text1)120 returnlistcomarr1121

122 #将xml内容转换成按序排列的list,返回值有3个:处理后的spmlxmllist、不需要处理的头部spmlstart、不需要处理的尾部spmlend

123 #spmlstart、spmlend是为了控制不需要处理的头部和尾部,提高处理效率

124 defxmltolist(spml):125 if spml.find("]*>', spml).span()[1]127 endnum = spml.rfind("")128 spmlstart =spml[:startnum].strip()129 spmlend =spml[endnum:].strip()130 spmlxml = '''\n%s''' %(131 spml[startnum:endnum].strip())132 elif spml.find("]*>', spml).span()[1]134 endnum = spml.rfind("")135 spmlstart =spml[:startnum].strip()136 spmlend =spml[endnum:].strip()137 spmlxml = '''\n%s''' %(spml[startnum:endnum].strip())138 else:139 spmlstart = ""

140 spmlend = ""

141 spmlxml =spml142 #print spmlstart

143 #print endspml

144 #print spmlxml

145 tree =ET.fromstring(spmlxml)146 spmlxmllist =listafter(tree)147 returnspmlxmllist, spmlstart, spmlend148

149 #将xmltolist处理形成的spmlxmllist再回头变成xml(xml中,同节点的内容已被按需排列)

150 deflisttoxml(spmllist1):151 kong = " "

152 spmltag1 =spmllist1[0]153 spmlattrib1 = ""

154 bodyxml1 = ""

155 if spmllist1[1] !={}:156 for key, value in spmllist1[1].items():157 spmlattrib1 += "%s='%s'" %(key, value)158 startxml1 = "<%s%s>" %(spmltag1, spmlattrib1)159 endxml1 = "%s>" %(spmltag1)160 spmlxml1 = ""

161 if isinstance(spmllist1[2][0], list):162 spmlxml2 = ""

163 for spmllist2 in spmllist1[2]:164 spmltag2 =spmllist2[0]165 spmlattrib2 = ""

166 bodyxml2 = ""

167 if spmllist2[1] !={}:168 for key, value in spmllist2[1].items():169 spmlattrib2 += "%s='%s'" %(key, value)170 startxml2 = "<%s%s>" %(spmltag2, spmlattrib2)171 endxml2 = "%s>" %(spmltag2)172 if isinstance(spmllist2[2][0], list):173 spmlxml3 = ""

174 for spmllist3 in spmllist2[2]:175 spmltag3 =spmllist3[0]176 spmlattrib3 = ""

177 bodyxml3 = ""

178 if spmllist3[1] !={}:179 for key, value in spmllist3[1].items():180 spmlattrib3 += "%s='%s'" %(key, value)181 startxml3 = "<%s%s>" %(spmltag3, spmlattrib3)182 endxml3 = "%s>" %(spmltag3)183 if isinstance(spmllist3[2][0], list):184 spmlxml4 = ""

185 for spmllist4 in spmllist3[2]:186 spmltag4 =spmllist4[0]187 spmlattrib4 = ""

188 bodyxml4 = ""

189 if spmllist4[1] !={}:190 for key, value in spmllist4[1].items():191 spmlattrib4 += "%s='%s'" %(key, value)192 startxml4 = "<%s%s>" %(spmltag4, spmlattrib4)193 endxml4 = "%s>" %(spmltag4)194 if isinstance(spmllist4[2][0], list):195 spmlxml5 = ""

196 for spmllist5 in spmllist4[2]:197 spmltag5 =spmllist5[0]198 spmlattrib5 = ""

199 bodyxml5 = ""

200 if spmllist5[1] !={}:201 for key, value in spmllist5[1].items():202 spmlattrib5 += "%s='%s'" %(key, value)203 startxml5 = "<%s%s>" %(spmltag5, spmlattrib5)204 endxml5 = "%s>" %(spmltag5)205 if isinstance(spmllist5[2][0], list):206 spmlxml6 = ""

207 for spmllist6 in spmllist5[2]:208 spmltag6 =spmllist6[0]209 spmlattrib6 = ""

210 bodyxml6 = ""

211 if spmllist6[1] !={}:212 for key, value in spmllist6[1].items():213 spmlattrib6 += "%s='%s'" %(key, value)214 startxml6 = "<%s%s>" %(spmltag6, spmlattrib6)215 endxml6 = "%s>" %(spmltag6)216 if isinstance(spmllist6[2][0], list):217 spmlxml7 = ""

218 for spmllist7 in spmllist6[2]:219 spmltag7 =spmllist7[0]220 spmlattrib7 = ""

221 bodyxml7 = ""

222 if spmllist7[1] !={}:223 for key, value in spmllist7[1].items():224 spmlattrib7 += "%s='%s'" %(key, value)225 startxml7 = "<%s%s>" %(spmltag7, spmlattrib7)226 endxml7 = "%s>" %(spmltag7)227 if isinstance(spmllist7[2][0], list):228 spmlxml8 = ""

229 for spmllist8 in spmllist7[2]:230 spmltag8 =spmllist8[0]231 spmlattrib8 = ""

232 bodyxml8 = ""

233 if spmllist8[1] !={}:234 for key, value in spmllist8[1].items():235 spmlattrib8 += "%s='%s'" %(key, value)236 startxml8 = "<%s%s>" %(spmltag8, spmlattrib8)237 endxml8 = "%s>" %(spmltag8)238 if isinstance(spmllist8[2][0], list):239 spmlxml9 = ""

240 for spmllist9 in spmllist8[2]:241 spmltag9 =spmllist9[0]242 spmlattrib9 = ""

243 bodyxml9 = ""

244 if spmllist9[1] !={}:245 for key, value in spmllist9[1].items():246 spmlattrib9 += "%s='%s'" %(key, value)247 startxml9 = "<%s%s>" %(spmltag9, spmlattrib9)248 endxml9 = "%s>" %(spmltag9)249 if isinstance(spmllist9[2][0], list):250 spmlxml10 = ""

251 for spmllist10 in spmllist9[2]:252 spmltag10 =spmllist10[0]253 spmlattrib10 = ""

254 bodyxml10 = ""

255 if spmllist10[1] !={}:256 for key, value in spmllist10[1].items():257 spmlattrib10 += "%s='%s'" %(258 key, value)259 startxml10 = "<%s%s>" %(260 spmltag10, spmlattrib10)261 endxml10 = "%s>" %(spmltag10)262 bodyxml10 = spmllist10[2][0]263 spmlxml10 += "\n%s%s%s%s" %(264 kong * 9, startxml10, bodyxml10,265 endxml10)266 spmlxml9 += "\n%s%s%s\n%s%s" %(267 kong * 8, startxml9, spmlxml10, kong * 8,268 endxml9)269 else:270 bodyxml9 = spmllist9[2][0]271 spmlxml9 += "\n%s%s%s%s" %(272 kong * 8, startxml9, bodyxml9, endxml9)273 spmlxml8 += "\n%s%s%s\n%s%s" %(274 kong * 7, startxml8, spmlxml9, kong * 7, endxml8)275 else:276 bodyxml8 = spmllist8[2][0]277 spmlxml8 += "\n%s%s%s%s" %(278 kong * 7, startxml8, bodyxml8, endxml8)279 spmlxml7 += "\n%s%s%s\n%s%s" %(280 kong * 6, startxml7, spmlxml8, kong * 6, endxml7)281 else:282 bodyxml7 = spmllist7[2][0]283 spmlxml7 += "\n%s%s%s%s" %(284 kong * 6, startxml7, bodyxml7, endxml7)285 spmlxml6 += "\n%s%s%s\n%s%s" %(286 kong * 5, startxml6, spmlxml7, kong * 5, endxml6)287 else:288 bodyxml6 = spmllist6[2][0]289 spmlxml6 += "\n%s%s%s%s" % (kong * 5, startxml6, bodyxml6, endxml6)290 spmlxml5 += "\n%s%s%s\n%s%s" %(291 kong * 4, startxml5, spmlxml6, kong * 4, endxml5)292 else:293 bodyxml5 = spmllist5[2][0]294 spmlxml5 += "\n%s%s%s%s" % (kong * 4, startxml5, bodyxml5, endxml5)295 spmlxml4 += "\n%s%s%s\n%s%s" % (kong * 3, startxml4, spmlxml5, kong * 3, endxml4)296 else:297 bodyxml4 = spmllist4[2][0]298 spmlxml4 += "\n%s%s%s%s" % (kong * 3, startxml4, bodyxml4, endxml4)299 spmlxml3 += "\n%s%s%s\n%s%s" % (kong * 2, startxml3, spmlxml4, kong * 2, endxml3)300 else:301 bodyxml3 = spmllist3[2][0]302 spmlxml3 += "\n%s%s%s%s" % (kong * 2, startxml3, bodyxml3, endxml3)303 spmlxml2 += "\n%s%s%s\n%s%s" % (kong * 1, startxml2, spmlxml3, kong * 1, endxml2)304 else:305 bodyxml2 = spmllist2[2][0]306 spmlxml2 += "\n%s%s%s%s" % (kong * 1, startxml2, bodyxml2, endxml2)307 spmlxml1 += "\n%s%s\n%s" %(startxml1, spmlxml2, endxml1)308 else:309 bodyxml1 = spmllist1[2][0]310 spmlxml1 += "\n%s%s%s" %(startxml1, bodyxml1, endxml1)311 returnspmlxml1312

313 #将startspml, xmlspml, endspml组合起来,其中有一部分内容需要根据实际情况处理

314 defregroupspml(startspml, xmlspml, endspml):315 xmlspml = str(xmlspml).replace("{{", "").replace("}}", ":").strip().splitlines()316 if endspml != "":317 startspml = str(startspml.strip()).replace("\"", "\'")318 startspml = re.sub("+>", ">", startspml)319 startspml =startspml.splitlines()323 endspml =str(endspml.strip()).splitlines()324 spmlxmlcom = startspml + xmlspml[1:-1] +endspml325 else:326 spmlxmlcom =xmlspml327 returnspmlxmlcom328

329 #对按序排列的xml进行内容比对,生成html文件,可以很直接的看出内容区别

330 defdiffspml(spmlxml1, spmlxml2):331 spmlxmllist1, spmlstart1, spmlend1 =xmltolist(spmlxml1)332 spmlxmllist2, spmlstart2, spmlend2 =xmltolist(spmlxml2)333 spmlxmlcom1 =listtoxml(spmlxmllist1)334 spmlxmlcom2 =listtoxml(spmlxmllist2)335 spmlxmlcom1 =regroupspml(spmlstart1, spmlxmlcom1, spmlend1)336 spmlxmlcom2 =regroupspml(spmlstart2, spmlxmlcom2, spmlend2)337 #print spmlstart1

338 #print spmlend1

339 if spmlxmlcom1 ==spmlxmlcom2:340 return0341 else:342 globaldiffspmNum343 globaloutputhtml_dir344 try:345 diffspmNum += 1

346 except:347 diffspmNum = 1

348 system =platform.system()349 if ('Windows' insystem):350 outputhtml_dir = "c:/RobotLog"

351 else:352 outputhtml_dir = "/tmp/RobotLog"

353 outputhtml_dir = "%s/%s" % (outputhtml_dir, datetime.datetime.now().strftime('%Y%m%d_%H%M%S'))354 os.makedirs(outputhtml_dir)355 Loghtmldir = "%s/%s.html" %(outputhtml_dir, diffspmNum)356 #logger.write("%s" % (Loghtmldir, Loghtmldir), "HTML")

357 hd =difflib.HtmlDiff(8,65)358 with open(Loghtmldir, 'w') as fo:359 fo.write(hd.make_file(spmlxmlcom1, spmlxmlcom2))360 fo.close()361 return Loghtmldir

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值