Ein Ansatz wäre, zuerst beide XML-Dateien in Canonical XML umzuwandeln und die Ergebnisse mit diff
zu vergleichen . Zum Beispiel kann xmllint verwendet werden, um XML zu kanonisieren.
$ xmllint --c14n one.xml > 1.xml
$ xmllint --c14n two.xml > 2.xml
$ diff 1.xml 2.xml
Oder als Einzeiler.
$ diff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
Jukkas Antwort hat bei mir nicht funktioniert, aber sie hat auf Canonical XML verwiesen. Weder --c14n noch --c14n11 die Attribute sortiert, aber ich habe die --exc-c14n gefunden switch hat die Attribute sortiert. --exc-c14n nicht in der Manpage aufgeführt, aber in der Befehlszeile als "W3C exclusive canonical format" beschrieben.
$ 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)
Warnung --exc-c14n Entfernt den XML-Header, während --c14n den XML-Header voranstellt, wenn er nicht vorhanden ist.
Ich habe versucht, die Antwort von @Jukka Matilainen zu verwenden, hatte aber Probleme mit Leerzeichen (eine der Dateien war ein riesiger Einzeiler). Mit --format
hilft, Leerraumunterschiede zu überspringen.
xmllint --format one.xml > 1.xml
xmllint --format two.xml > 2.xml
diff 1.xml 2.xml
Hinweis:Verwenden Sie vimdiff
Befehl für den direkten Vergleich der xmls.