python比较2个xml内容

from xml.etree import ElementTree

OK=True
main_pid = 10000
loop_depth = 0
def compare_xml(left, right, key_info='.'):
    global loop_depth
    loop_depth += 1
    if loop_depth == 1: print
    if left.tag != right.tag:
        print_diff(main_pid, key_info, 'difftag', left.tag, right.tag)
        return
    if left.text != right.text:
        print_diff(main_pid, key_info, 'difftext', left.text, right.text)
        return
    leftitems = dict(left.items())
    rightitems = dict(right.items())
    for k,v in leftitems.items():
        if k not in rightitems:
            s = '%s/%s' % (key_info, left.tag)
            print_diff(main_pid, s, 'lostattr', k, "")
    for k,v in rightitems.items():
        if k not in leftitems:
            s = '%s/%s' % (key_info, right.tag)
            print_diff(main_pid, s, 'extraattr', "", k)
    leftnodes = left.getchildren()
    rightnodes = right.getchildren()
    leftlen = len(leftnodes)
    rightlen = len(rightnodes)
    if leftlen != rightlen:
        s = '%s/%s' % (key_info, right.tag)
        print_diff(main_pid, s, 'difflen', leftlen, rightlen)
        return
    l = leftlen<rightlen and leftlen or rightlen
    d = {}
    for i in xrange(l):        
        node=leftnodes[i]
        if node.tag not in d:
            d[node.tag] = 1
            tag = node.tag
        else:
            tag = node.tag + str(d[node.tag])
            d[node.tag] += 1
        s = '%s/%s' % (key_info, tag)
        compare_xml(leftnodes[i], rightnodes[i], s)


def print_diff(main_pid, key_info, msg, base_type, test_type):
    global OK
    info = u'[ %-5s ] %s -> %-40s [ %s != %s ]'%(msg.upper(), main_pid, key_info.strip('./'), base_type, test_type)
    print info.encode('gbk')
    OK = False


调用:

if __name__ == '__main__':
    s1 = '''<?xml version="1.0" encoding="UTF-8"?> \
		 <employees> \
		  <employee id = '1'> \
			<name>linux</name>\
			<age>30</age>\
		  </employee>\
		  <employee id = '2'> \
			<name>windows</name>\
			<age>20</age>\
		  </employee>\
		 </employees>''' 
		 
    s2 = '''<?xml version="1.0" encoding="UTF-8"?> \
		 <employees> \
		  <employee id = '3'> \
			<name>windows</name>\
			<age>20</age>\
		  </employee>\
		  <employee id = '4'> \
			<name>linux</name>\
			<age>30</age>\
		  </employee>\
		 </employees>''' 
    lroot = ElementTree.fromstring(s1)
    rroot = ElementTree.fromstring(s2)
    compare_xml(lroot, rroot)


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上帝De助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值