2012-08-29 103 views
5

Tengo dos archivos XML (XSD) que son generados por alguna herramienta.
La herramienta no conserva el orden de los elementos, por lo que, aunque el contenido sea igual, se comparará como texto, ya que los archivos son diferentes.
¿Hay alguna herramienta que pueda ordenar los elementos antes de comparar y permita la comparación de texto de los documentos? Por supuesto, la clasificación debe hacerse de forma recursiva. ejemploCómo comparar archivos XML

datos:
Archivo A:

<xml> 
    <A/> 
    <B/> 
</xml> 

Archivo B:

<xml> 
    <B/> 
    <A/> 
</xml> 

Respuesta

4

que tenía un problema similar y al final encontré: http://superuser.com/questions/79920/how-can-i-diff-two-xml-files

Ese puesto sugiere hacer una especie XML canónica a continuación haciendo diferencias. Lo que sigue debe trabajar para usted si usted está en Linux, Mac, o si tiene ventanas con algo como cygwin instalado:

$ xmllint --c14n FileA.xml > 1.xml 
$ xmllint --c14n FileB.xml > 2.xml 
$ diff 1.xml 2.xml 
-1

Las muestras XML son fundamentalmente diferentes. Aunque el contenido y la jerarquía pueden ser idénticos, las relaciones entre pares son diferentes. Cuando se analiza XML, se analiza en una estructura llamada DOM donde las relaciones entre unidades son muy importantes. Si desea descontar la naturaleza de las relaciones entre entidades pares, es probable que necesite un software personalizado. Recomiendo encontrar alguna herramienta simple de reconocimiento XML compatible con código abierto y agregar los requisitos adicionales que necesita. Escribí uno al http://prettydiff.com/ pero le sugiero que mire a su alrededor para ver qué hay disponible antes de tomar una decisión, porque la edición de los algoritmos de otra persona puede requerir un poco de trabajo pesado.

0

Por lo que vale la pena, he creado una herramienta de Java (o Kotlin en realidad) para la eficiente y canonicalización configurable de archivos xml.

Siempre será:

  • Ordenar nodos y atributos por su nombre.
  • Eliminar espacios de nombres (sí, podría - hipotéticamente - ser un problema).
  • Prettyprint el resultado.

Además se le puede decir a:

  • eliminar una lista dada de nombres de nodo - tal vez usted no quiere saber que el valor de una pieza de metadatos - decir <RequestReceivedTimestamp> ha cambiado.
  • Ordene una lista dada de colecciones en el contexto del padre - tal vez no le importe que el orden de las entradas <Contact> en <ListOfFavourites> haya cambiado.

Utiliza XSLT y hace todo lo anterior de manera eficiente mediante el encadenamiento.

Limitaciones

Lo hace apoyo de clasificación listas anidadas - Clasificación de listas más internas antes de exterior. Pero no puede ordenar de manera fiable los niveles arbitrarios de listas anidadas recursivamente.

Si tiene tales necesidades puede, después de haber utilizado esta herramienta, comparar los conjuntos de bytes ordenados de los resultados. serán iguales si solo quedan problemas de clasificación de listas.

dónde conseguirlo

Usted puede obtener aquí: XMLNormalize

Cuestiones relacionadas