Un approccio potrebbe essere quello di trasformare prima entrambi i file XML in Canonical XML e confrontare i risultati utilizzando diff
. Ad esempio, xmllint può essere utilizzato per canonizzare XML.
$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml
O come one-liner.
$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
La risposta di Jukka non ha funzionato per me, ma indicava Canonical XML. Né --c14n né --c14n11 ho ordinato gli attributi, ma ho trovato --exc-c14n switch ha ordinato gli attributi. --exc-c14n non è elencato nella pagina man, ma descritto nella riga di comando come "formato canonico esclusivo 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)
Avviso --exc-c14n rimuove l'intestazione xml mentre --c14n antepone l'intestazione xml se non è presente.
Ho provato a usare la risposta di @Jukka Matilainen ma ho avuto problemi con gli spazi bianchi (uno dei file era un enorme one-liner). Usando --format
aiuta a saltare le differenze degli spazi bianchi.
xmllint --format one.xml > 1.xml
xmllint --format two.xml > 2.xml
diff 1.xml 2.xml
Nota:usa vimdiff
comando per il confronto affiancato degli xml.