Jedním přístupem by bylo nejprve převést oba soubory XML na kanonické XML a porovnat výsledky pomocí diff
. Například xmllint lze použít ke kanonizaci XML.
$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml
Nebo jako jednovrstvý.
$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
Jukkova odpověď pro mě nefungovala, ale ukazovala na Canonical XML. Ani --c14n ani --c14n11 seřadil atributy, ale našel jsem --exc-c14n přepínač seřadil atributy. --exc-c14n není uveden v manuálové stránce, ale je popsán na příkazovém řádku jako "exkluzivní kanonický formát 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)
Upozornění --exc-c14n odstraní hlavičku xml, zatímco --c14n předpíše hlavičku xml, pokud tam není.
Pokusil jsem se použít odpověď @Jukka Matilainena, ale měl problémy s mezerami (jeden ze souborů byl velký jednořádkový). Pomocí --format
pomáhá přeskočit rozdíly mezi mezerami.
xmllint --format one.xml > 1.xml
xmllint --format two.xml > 2.xml
diff 1.xml 2.xml
Poznámka:Použijte vimdiff
příkaz pro porovnání xmls vedle sebe.