Sous Linux, comment générer un diff entre deux fichiers XML?
Idéalement, j'aimerais pouvoir le configurer sur certaines choses strictes ou desserrer certaines choses, telles que les espaces ou l'ordre des attributs.
Je veillerai souvent à ce que les fichiers soient fonctionnellement identiques, mais diff en soi serait fastidieux à utiliser, surtout si le fichier XML ne comporte pas beaucoup de sauts de ligne.
Par exemple, ce qui suit devrait vraiment me convenir:
<tag att1="one" att2="two">
content
</tag>
<tag att2="two" att1="one">
content
</tag>
Une approche consisterait tout d'abord à convertir les deux fichiers XML en XML canonique et à comparer les résultats à l'aide de diff
. Par exemple, xmllint peut être utilisé pour canoniser XML.
$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml
Ou comme un one-liner.
$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
La réponse de Jukka ne fonctionnait pas pour moi, mais elle renvoyait au code XML canonique. Ni - c14n ni - c14n11 ne trièrent les attributs, mais j’ai trouvé le Le commutateur - exc-c14n trie les attributs. - exc-c14n n'est pas répertorié dans la page de manuel, mais est décrit comme suit sur la ligne de commande "Format canonique exclusif du W3C".
$ xmllint --exc-c14n one.xml > 1.xml
$ xmllint --exc-c14n two.xml > 2.xml
$ diff 1.xml 2.xml
$ xmllint | grep c14
--c14n : save in W3C canonical format v1.0 (with comments)
--c14n11 : save in W3C canonical format v1.1 (with comments)
--exc-c14n : save in W3C exclusive canonical format (with comments)
$ rpm -qf /usr/bin/xmllint
libxml2-2.7.6-14.el6.x86_64
libxml2-2.7.6-14.el6.i686
$ cat /etc/system-release
CentOS release 6.5 (Final)
Warning - exc-c14n supprime l'en-tête xml alors que --c14n ajoute l'en-tête xml si pas là.
J'ai essayé d'utiliser la réponse de @Jukka Matilainen, mais j'avais des problèmes d'espace blanc (l'un des fichiers était une énorme doublure). L'utilisation de --format
permet d'éviter les différences d'espaces.
xmllint --format one.xml > 1.xml
xmllint --format two.xml > 2.xml
diff 1.xml 2.xml
Remarque: Utilisez la commande vimdiff
pour comparer côte à côte les xml.
Si vous souhaitez également ignorer l'ordre des éléments enfants, j'ai écrit un outil python simple appelé xmldiffs
:
Comparez deux fichiers XML en ignorant l'ordre des éléments et des attributs.
Utilisation:
xmldiffs [OPTION] FILE1 FILE2
Toute option supplémentaire est transmise à la commande
diff
.
Obtenez-le à https://github.com/joh/xmldiffs
J'utilise Beyond Compare pour comparer tous les types de fichiers texte. Ils produisent des versions pour Windows et Linux.