98 votes

Comment puis-je différencier deux fichiers XML ?

Sous Linux, comment puis-je générer une différence entre deux fichiers XML ?

Idéalement, j'aimerais pouvoir le configurer pour qu'il soit plus strict ou moins strict, comme les espaces blancs ou l'ordre des attributs.

Je me soucie souvent du fait que les fichiers sont fonctionnellement identiques, mais diff seul serait ennuyeux à 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>

111voto

Nicholas Points 435

Une approche serait de transformer d'abord les deux fichiers XML en XML canonique et comparez les résultats en utilisant diff . Par exemple, xmllint peut être utilisé pour canoniser le XML.

$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml

Ou en une phrase.

$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)

30voto

rjt Points 938

La réponse de Jukka n'a pas fonctionné pour moi, mais elle a indiqué Canonical XML. Ni --c14n ni --c14n11 J'ai trié les attributs, mais j'ai trouvé l'attribut --exc-c14n Le commutateur a trié les attributs. --exc-c14n ne figure pas dans la page de manuel, mais est décrit sur la ligne de commande comme "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)

Avertissement --exc-c14n supprime l'en-tête xml alors que --c14n ajoute l'en-tête xml s'il n'est pas présent.

23voto

GuruM Points 331

J'ai essayé d'utiliser la réponse de @Jukka Matilainen mais j'ai eu des problèmes avec les espaces blancs (l'un des fichiers était un énorme one-liner). Utilisation de --format permet de sauter les différences d'espace blanc.

xmllint --format one.xml > 1.xml  
xmllint --format two.xml > 2.xml  
diff 1.xml 2.xml  

Note : Utilisez vimdiff pour une comparaison côte à côte des xmls.

7voto

Reya276 Points 469

Diffxml assure une fonctionnalité de base correcte, bien qu'il ne semble pas offrir beaucoup d'options de configuration.

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

6voto

joh Points 1553

Si vous souhaitez également ignorer l'ordre des éléments enfants, j'ai écrit un outil Python simple pour cela, 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 fonction diff commandement.

Obtenez-le à https://github.com/joh/xmldiffs

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X