¿Comparar fragmentos de XML?
Sobre la base deotra pregunta SO, ¿cómo se puede verificar si dos fragmentos XML bien formados son semánticamente iguales? Todo lo que necesito es "igual" o no, ya que estoy usando esto para pruebas unitarias.
En el sistema que quiero, estos serían iguales (tenga en cuenta el orden de 'inicio' y 'fin'):
<?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>
¡Tengo lmxl y otras herramientas a mi disposición, y una función simple que solo permite reordenar atributos también funcionaría bien!
Fragmento de trabajo basado en la respuesta de IanB:
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