Compare XML snippets?

后端 未结 10 912
名媛妹妹
名媛妹妹 2020-11-30 03:42

Building on another SO question, how can one check whether two well-formed XML snippets are semantically equal. All I need is \"equal\" or not, since I\'m using this for un

10条回答
  •  无人及你
    2020-11-30 04:43

    Thinking about this problem, I came up with the following solution that renders XML elements comparable and sortable:

    import xml.etree.ElementTree as ET
    def cmpElement(x, y):
        # compare type
        r = cmp(type(x), type(y))
        if r: return r 
        # compare tag
        r = cmp(x.tag, y.tag)
        if r: return r
        # compare tag attributes
        r = cmp(x.attrib, y.attrib)
        if r: return r
        # compare stripped text content
        xtext = (x.text and x.text.strip()) or None
        ytext = (y.text and y.text.strip()) or None
        r = cmp(xtext, ytext)
        if r: return r
        # compare sorted children
        if len(x) or len(y):
            return cmp(sorted(x.getchildren()), sorted(y.getchildren()))
        return 0
    
    ET._ElementInterface.__lt__ = lambda self, other: cmpElement(self, other) == -1
    ET._ElementInterface.__gt__ = lambda self, other: cmpElement(self, other) == 1
    ET._ElementInterface.__le__ = lambda self, other: cmpElement(self, other) <= 0
    ET._ElementInterface.__ge__ = lambda self, other: cmpElement(self, other) >= 0
    ET._ElementInterface.__eq__ = lambda self, other: cmpElement(self, other) == 0
    ET._ElementInterface.__ne__ = lambda self, other: cmpElement(self, other) != 0
    

提交回复
热议问题