En Linux, ¿cómo podría generar una diferencia entre dos archivos XML?
Idealmente, me gustaría poder configurarlo para algunas cosas estrictas, o aflojar algunas cosas, como espacios en blanco u orden de atributos.
A menudo me importa que los archivos sean funcionalmente iguales, pero que difieran por sí mismos, sería molesto de usar, especialmente si el archivo XML no tiene muchos saltos de línea.
Por ejemplo, lo siguiente realmente debería estar bien para mí:
<tag att1="one" att2="two">
content
</tag>
<tag att2="two" att1="one">
content
</tag>
vimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
La respuesta de Jukka no funcionó para mí, pero sí señaló a Canonical XML. Ni --c14n ni --c14n11 ordenaron los atributos, pero encontré que el modificador --exc-c14n clasificó los atributos. --exc-c14n no aparece en la página del manual, pero se describe en la línea de comandos como "formato canónico exclusivo del W3C".
Advertencia --exc-c14n elimina el encabezado xml, mientras que --c14n antepone el encabezado xml si no está allí.
fuente
Intenté usar la respuesta de @Jukka Matilainen pero tuve problemas con el espacio en blanco (uno de los archivos era enorme). El uso
--format
ayuda a omitir las diferencias de espacios en blanco.Nota: Use el
vimdiff
comando para la comparación lado a lado de los xmls.fuente
two.xml
fue generadoone.xml
por un script. Así que solo necesitaba verificar qué fue agregado / eliminado por el script.--format
con--exc-c14n
; probablemente será aún más lento de procesar :(--exc-c14n
opción especifica la clasificación de los atributos. En sus archivos específicos, los atributos probablemente ya estaban ordenados, pero el consejo general sería utilizar la combinación--format --exc-c14n
.Diffxml obtiene la funcionalidad básica correcta, aunque no parece ofrecer muchas opciones de configuración.
Editar: Project Diffxml se ha migrado a GitHub desde 2013.
fuente
Si desea ignorar también el orden de los elementos secundarios, escribí una herramienta simple de Python para esto llamada
xmldiffs
:Consíguelo en https://github.com/joh/xmldiffs
fuente
Mi script Python xdiff.py para comparar archivos XML ignora las diferencias en el espacio en blanco o el orden de los atributos (en contraste con el orden de los elementos).
Para comparar dos archivos
1.xml
y2.xml
, debería ejecutar el script de la siguiente manera:En el ejemplo del OP, no generará nada y devolverá el estado de salida
0
(sin diferencias estructurales o textuales).En casos donde
1.xml
y2.xml
difieren estructuralmente, imita la salida unificada de GNU diff y devuelve el estado de salida1
. Existen varias opciones para controlar la salida, como la-a
salida de todo el contexto, la-n
salida sin contexto y la-q
supresión de la salida por completo (mientras se devuelve el estado de salida).fuente
Uso Beyond Compare para comparar todos los tipos de archivos basados en texto. Producen versiones para Windows y Linux.
fuente
Nuestro SD Smart Differencer compara documentos basados en la estructura en comparación con el diseño real.
Hay un XML Smart Differencer. Para XML, eso significa un orden coincidente de etiquetas y contenido. Debe tener en cuenta que la cadena de texto en el fragmento específico que indicó fue diferente. Actualmente no comprende la noción XML de los atributos de etiqueta que indican si el espacio en blanco está normalizado o no significativo.
fuente
No estoy seguro de si (la dependencia de) una herramienta en línea cuenta como una solución, pero, por lo que vale, obtuve un buen resultado en esta herramienta de comparación de XML en línea . Simplemente funciona
fuente