Une approche consisterait à transformer d'abord 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 une ligne.
$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
La réponse de Jukka n'a pas fonctionné pour moi, mais elle indiquait Canonical XML. Ni --c14n ni --c14n11 trié les attributs, mais j'ai trouvé le --exc-c14n switch a trié les attributs. --exc-c14n n'est pas répertorié dans la page de manuel, mais décrit sur la ligne de commande comme "format canonique exclusif 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'y est pas.
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
aide à ignorer les différences d'espace blanc.
xmllint --format one.xml > 1.xml
xmllint --format two.xml > 2.xml
diff 1.xml 2.xml
Remarque :Utilisez vimdiff
commande pour la comparaison côte à côte des xmls.