Wie kann ich unter Linux einen Unterschied zwischen zwei XML-Dateien erzeugen?
Idealerweise würde ich es gerne in der Lage sein, einige Dinge streng zu konfigurieren oder einige Dinge zu lockern, wie Leerzeichen oder Attributreihenfolge.
Es ist mir oft wichtig, dass die Dateien funktional identisch sind, sich jedoch von selbst unterscheiden. Die Verwendung wäre ärgerlich, insbesondere wenn die XML-Datei nicht viele Zeilenumbrüche enthält.
Zum Beispiel sollte mir Folgendes wirklich recht sein:
<tag att1="one" att2="two">
content
</tag>
<tag att2="two" att1="one">
content
</tag>
vimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
Die Antwort von Jukka hat bei mir nicht funktioniert, zeigte aber auf Canonical XML. Weder --c14n noch --c14n11 haben die Attribute sortiert, aber ich habe festgestellt, dass der Schalter --exc-c14n die Attribute sortiert hat. --exc-c14n ist nicht in der Manpage aufgeführt, wird jedoch in der Befehlszeile als "exklusives kanonisches W3C-Format" beschrieben.
Warnung --exc-c14n entfernt den xml-Header, wohingegen --c14n dem xml-Header vorangeht, falls nicht vorhanden.
quelle
Versuchte die Antwort von @Jukka Matilainen zu verwenden, hatte aber Probleme mit dem Leerraum (eine der Dateien war ein riesiger Einzeiler). Mit können Sie
--format
Leerraumunterschiede überspringen.Hinweis: Verwenden Sie den
vimdiff
Befehl für den direkten Vergleich der XML-Dateien.quelle
two.xml
wurdeone.xml
von einem Skript generiert . Also musste ich nur überprüfen, was vom Skript hinzugefügt / entfernt wurde.--format
mit kombiniert--exc-c14n
; wird wahrscheinlich noch langsamer zu verarbeiten sein :(--exc-c14n
Option legt die Sortierung der Attribute fest. In Ihren spezifischen Dateien wurden die Attribute wahrscheinlich bereits sortiert, aber der allgemeine Rat wäre, die Kombination zu verwenden--format --exc-c14n
.Diffxml stellt die Grundfunktionalität korrekt dar, obwohl es nicht viele Konfigurationsoptionen zu bieten scheint.
Bearbeiten: Project Diffxml wird seit 2013 auf GitHub migriert.
quelle
Wenn Sie auch die Reihenfolge der untergeordneten Elemente ignorieren möchten, habe ich ein einfaches Python-Tool dafür geschrieben
xmldiffs
:Laden Sie es unter https://github.com/joh/xmldiffs herunter
quelle
Mein Python-Skript xdiff.py zum Vergleichen von XML-Dateien ignoriert Unterschiede in der Whitespace- oder Attributreihenfolge (im Gegensatz zur Elementreihenfolge).
Um zwei Dateien
1.xml
und zu vergleichen2.xml
, führen Sie das Skript wie folgt aus:Im Beispiel des OP würde es nichts ausgeben und den Exit-Status zurückgeben
0
(für keine strukturellen oder textuellen Unterschiede).In Fällen , in denen
1.xml
und2.xml
strukturell unterscheiden, imitiert er das einheitliche Ausgabe von GNU diff und Exit - Status zurückgibt1
. Es gibt verschiedene Möglichkeiten, die Ausgabe zu steuern, z. B. den-a
gesamten Kontext auszugeben,-n
keinen Kontext-q
auszugeben und die Ausgabe insgesamt zu unterdrücken (während weiterhin der Beendigungsstatus zurückgegeben wird).quelle
Ich benutze Beyond Compare , um alle Arten von textbasierten Dateien zu vergleichen. Sie produzieren Versionen für Windows und Linux.
quelle
Unser SD Smart Differencer vergleicht Dokumente anhand der Struktur und nicht anhand des tatsächlichen Layouts.
Es gibt einen XML Smart Differencer. Für XML bedeutet dies, dass die Reihenfolge der Tags und des Inhalts übereinstimmt. Es sollte beachtet werden, dass die Textzeichenfolge in dem angegebenen Fragment unterschiedlich war. Derzeit wird der XML-Begriff der Tag-Attribute nicht verstanden, der angibt, ob Leerzeichen normalisiert oder signifikant sind.
quelle
Ich bin nicht sicher, ob (die Abhängigkeit von) einem Online-Tool als Lösung gilt, aber für das, was es wert ist, habe ich in diesem Online-XML-Vergleichstool ein gutes Ergebnis erzielt . Es funktioniert einfach.
quelle