Xml comparison in Python
Question: Building on [another SO
question](http://stackoverflow.com/questions/794331/xml-comparison-in-c), 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 unit tests.

In the system I want, these would be equal (note the order of 'start' and
'end'):

    
    
    <?xml version='1.0' encoding='utf-8' standalone='yes'?>
    <Stats start="1275955200" end="1276041599">
    </Stats>
    
    # Reordered start and end
    
    <?xml version='1.0' encoding='utf-8' standalone='yes'?>
    <Stats end="1276041599" start="1275955200" >
    </Stats>
    

I have lmxl and other tools at my disposal, and a simple function that only
allows reordering of attributes would work fine as well!

* * *

Working snippet based on IanB's answer:

    
    
    from formencode.doctest_xml_compare import xml_compare
    # have to strip these or fromstring carps
    xml1 = """    <?xml version='1.0' encoding='utf-8' standalone='yes'?>
        <Stats start="1275955200" end="1276041599"></Stats>"""
    xml2 = """     <?xml version='1.0' encoding='utf-8' standalone='yes'?>
        <Stats end="1276041599" start="1275955200"></Stats>"""
    xml3 = """ <?xml version='1.0' encoding='utf-8' standalone='yes'?>
        <Stats start="1275955200"></Stats>"""
    
    from lxml import etree
    tree1 = etree.fromstring(xml1.strip())
    tree2 = etree.fromstring(xml2.strip())
    tree3 = etree.fromstring(xml3.strip())
    
    import sys
    reporter = lambda x: sys.stdout.write(x + "\n")
    
    assert xml_compare(tree1,tree2,reporter)
    assert xml_compare(tree1,tree3,reporter) is False
    


Answer: You can use
[formencode.doctest_xml_compare](http://bitbucket.org/ianb/formencode/src/tip/formencode/doctest_xml_compare.py#cl-70)
\-- the xml_compare function compares two ElementTree or lxml trees.

