web-dev-qa-db-fra.com

Comment puis-je diff deux fichiers XML?

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>
73
qedi

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)
84
Jukka Matilainen

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à.

21
rjt

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.

17
GuruM

Diffxml obtient la fonctionnalité de base correcte, bien qu'elle ne semble pas offrir beaucoup d'options de configuration.

Edit: Projet Diffxml a été migré vers GitHub depuis 2013.

6
dsolimano

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

4
joh

J'utilise Beyond Compare pour comparer tous les types de fichiers texte. Ils produisent des versions pour Windows et Linux.

0
Alan