Wie kann ich zwei XML-Dateien diff?

Wie kann ich unter Linux ein Diff zwischen zwei XML-Dateien generieren?

Im Idealfall möchte ich es für einige Dinge streng konfigurieren oder einige Dinge wie Leerzeichen oder Attributreihenfolge lockern können.

Es ist mir oft wichtig, dass die Dateien funktional gleich sind, aber diff an sich wäre ärgerlich, besonders wenn die XML-Datei nicht viele Zeilenumbrüche hat.

Zum Beispiel sollte Folgendes für mich wirklich in Ordnung sein:

<tag att1="one" att2="two">
  content
</tag>

<tag att2="two" att1="one">
  content
</tag>
Author: slhck, 2009-12-07

9 answers

Ein Ansatz wäre, zuerst beide XML-Dateien in kanonisches 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)
 102
Author: Jukka Matilainen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2018-06-22 15:01:11

Jukkas Antwort hat bei mir nicht funktioniert,aber sie deutete auf kanonisches XML. Weder --c14n noch --c14n11 sortierten die Attribute, aber ich fand die --exc-c14n switch hat die Attribute sortiert. --exc-c14n wird 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 dem --c14n der XML-Header vorangestellt wird wenn nicht dort.

 28
Author: rjt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-03-04 12:51:56

Versuchte @Jukka Matilainen ' s Antwort zu verwenden, hatte aber Probleme mit Leerzeichen (eine der Dateien war ein riesiger Einzeiler). Die Verwendung von --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 den Befehl vimdiff für den Side-by-Side-Vergleich der xmls.

 21
Author: GuruM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2012-08-08 10:33:50

Diffxml erhält die grundlegende Funktionalität korrekt, obwohl es nicht viele Optionen für die Konfiguration zu bieten scheint.

Bearbeiten: Das Projekt Diffxml wurde seit 2013 auf GitHub migriert.

 7
Author: dsolimano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-01-15 15:23:44

Wenn Sie auch die Reihenfolge der untergeordneten Elemente ignorieren möchten, habe ich dafür ein einfaches Python-Tool namens xmldiffs geschrieben:

Vergleichen Sie zwei XML-Dateien und ignorieren Sie die Element-und Attributreihenfolge.

Verwendung: xmldiffs [OPTION] FILE1 FILE2

Alle zusätzlichen Optionen werden an den Befehl diff übergeben.

Holen Sie es sich bei https://github.com/joh/xmldiffs

 6
Author: joh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-12 13:48:39

Mein Python-Skript xdiff.py zum Vergleichen von XML-Dateien ignoriert Unterschiede in leerzeichen oder Attributreihenfolge (im Gegensatz zur Elementreihenfolge).

Um zwei Dateien 1.xml und 2.xml zu vergleichen, würden Sie das Skript wie folgt ausführen:

xdiff.py 1.xml 2.xml

Im Beispiel des OP würde es nichts ausgeben und den Exit-Status 0 zurückgeben (für no strukturelle oder textuelle Unterschiede).

In Fällen, in denen sich 1.xml und 2.xml strukturell unterscheiden, ahmt es die einheitliche Ausgabe von GNU diff und gibt den Exit-Status 1 zurück. Es gibt verschiedene Optionen zur Steuerung der Ausgabe, wie als -a für die Ausgabe des gesamten Kontexts, -n für die Ausgabe ohne Kontext und -q für unterdrücken der Ausgabe insgesamt (während immer noch der Exit-Status zurückgegeben wird).

 0
Author: Andreas Nolda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2019-08-22 18:10:59

Ich verwende Beyond Compare, um alle Arten von textbasierten Dateien zu vergleichen. Sie produzieren Versionen für Windows und Linux.

 -1
Author: Alan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2009-12-07 16:30:31

Unser [[1]}SD Smart Differencer vergleicht Dokumente basierend auf Struktur im Gegensatz zum tatsächlichen Layout.

Es gibt einen XML Smart Differencer. Für XML bedeutet dies die übereinstimmende Reihenfolge von Tags und Inhalten. Es sollte beachtet werden, dass die Textzeichenfolge in dem von Ihnen angegebenen Fragment unterschiedlich war. Es versteht derzeit nicht den XML-Begriff von Tag-Attributen, der angibt, ob leerzeichen sind normalisiert vs. signifikant.

 -1
Author: Ira Baxter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-11-27 15:52:33

Ich bin mir nicht sicher, ob (die Abhängigkeit) eines Online-Tools als Lösung zählt, aber für das, was es wert ist, habe ich in diesem Online-XML-Vergleichstool ein gutes Ergebnis erzielt. Es funktioniert einfach.

 -1
Author: RayLuo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-08-08 18:24:45