2009-08-18 17 views
5

¿Alguien sabe cómo obtendría una instancia DOM (árbol) de un archivo XML en Python. Estoy tratando de comparar dos documentos XML entre sí que pueden tener elementos y atributos en diferente orden. ¿Cómo haría esto?Obteniendo el árbol DOM del documento XML

Respuesta

2

Personalmente, siempre que sea posible, comenzaría con elementtree (preferiblemente la implementación C que viene con la biblioteca estándar de Python, o la implementación lxml, pero eso es esencialmente solo una cuestión de mayor velocidad). No es un DOM que cumple con los estándares, pero contiene la misma información de una manera más pitónica y más práctica. Puede comenzar llamando al xml.etree.ElementTree.parse, que toma el origen XML y devuelve un elemento-árbol; haga eso en ambas fuentes, use getroot en cada árbol de elementos para obtener su elemento raíz, luego compare recursivamente los elementos comenzando desde los de raíz.

Los elementos secundarios de un elemento forman una secuencia, en el árbol de elementos como en el DOM estándar, lo que significa que su orden se considera importante; pero es fácil hacer que Python los establezca (o con un poco más de esfuerzo "conjuntos múltiples" de algún tipo, si las repeticiones son importantes en su caso de uso, aunque el orden no lo es) para una comparación más flexible. Es aún más fácil para los atributos de un elemento dado, donde la exclusividad está asegurada y el orden semánticamente no es relevante.

¿Hay alguna razón específica por la que necesita un DOM estándar en lugar de un contenedor alternativo como un árbol de elementos, o simplemente usa el término DOM en un sentido general para que el árbol de elementos esté bien?

En el pasado también obtuve buenos resultados usando PyRXP, que usa una representación más uniforme y más clara que ElementTree. Sin embargo, ERA años y años atrás; No tengo experiencia reciente sobre cómo PyRXP hoy se compara con lxml o cElementTree.

1

Algunas soluciones para reflexionar:

+0

He visto minidom y no hay ninguna información en la documentación sobre cómo obtener un árbol DOM a partir de un archivo analizado. Me gustaría comparar dos árboles para que el orden no importe. ¿Tienes alguna idea de cómo hacer esto? – Dave

+0

La documentación de minidom en Python 2.6 da un ejemplo de cómo obtener un DOM de un archivo (¿está buscando algo más? desde xml.dom.minidom, análisis de importación, parseString dom1 = parse ('c: \\ temp \\ mydata.xml') # analizar un archivo XML por nombre – Mark

0

Para comparar instancias de documentos XML, una ingenua comparación de los árboles DOM analizados no va a funcionar. Es probable que necesita para implementar su propia NodeComperator que compara de forma recursiva un nodo y sus niños-nodos con algún otro nodo y sus niños-nodos en función de sus criterios específicos, tales como:

  • Cuando es el orden de los elementos secundarios significativos ?
  • ¿Cuándo es significativo el espacio en blanco en el contenido de texto?
  • ¿Hay valores predeterminados para algunos elementos y son aplicados por su analizador?
  • Deberían referencias a entidades ampliarse para la comparación

Minidom es un buen punto de partida para analizar los archivos y es fácil de usar. Sin embargo, la implementación real de la función de comparación para su aplicación específica debe ser realizada por usted.

Cuestiones relacionadas