Dienstprogramm zum logischen Vergleichen von zwei XML-Dateien?

8

Im Moment versuchen wir, Goldkonfigurationen für unsere Umgebung zu erstellen. Eine Software, die wir verwenden, basiert auf großen XMLDateien, um den Großteil ihrer Konfiguration zu enthalten. Wir möchten unsere Laborumgebung als unsere "Goldkonfiguration" katalogisieren und dann in Zukunft in der Lage sein, diese Konfiguration zu überprüfen.

Da diff ein byteweiser Vergleich und KEIN logischer Vergleich ist, können wir ihn in diesem Fall nicht zum Vergleichen von Dateien verwenden ( XMList ungeordnet, funktioniert also nicht). Was ich suche, ist etwas, das die beiden XMLDateien analysieren und Element für Element vergleichen kann. Bisher haben wir noch keine Dienstprogramme gefunden, die dies tun können. Betriebssystem spielt keine Rolle, ich kann es auf alles tun, wo es funktionieren wird. Die Präferenz ist etwas von der Stange.

Irgendwelche Ideen?

Bearbeiten: Ein Problem, auf das wir gestoßen sind, ist, dass die Konfigurationsdateien eines Anbieters gelegentlich dasselbe Element mehrmals erwähnen, jedes Mal mit unterschiedlichen Attributen. Welches Diff-Dienstprogramm wir auch verwenden, es muss in der Lage sein, entweder den Satz von Attributen oder alle als Teil eines Elements zu identifizieren. Große Bestellung :)

Matthew
quelle
1
XML InfoSet kann tatsächlich Auftragsbeschränkungen angeben, sodass die Idee, dass XML ungeordnet ist, umstritten ist. Und Sie dürfen die Attribute zweier Elemente sicherlich nicht zusammenführen, nur weil die Elemente dasselbe Tag haben. Dies wäre nur in bestimmten XML-Anwendungen gültig, ein generisches Tool geht jedoch nicht davon aus.
MSalters

Antworten:

4

Zwei Ansätze, die ich verwende, sind (a) das Kanonisieren beider XML-Dateien und das anschließende Vergleichen ihrer Serialisierungen sowie (b) das Verwenden der Deep-Equal () -Funktion von XPath 2.0. Beide Ansätze sind in Ordnung, um Ihnen zu sagen, ob die Dateien gleich sind, aber nicht sehr gut, um Ihnen zu sagen, wo sie sich unterscheiden.

Ein kommerzielles Tool, das sich auf dieses Problem spezialisiert hat, ist DeltaXML.

Wenn Sie Dinge haben, die Sie als gleichwertig betrachten, die jedoch auf XML-Ebene nicht gleichwertig sind, z. B. Elemente in einer anderen Reihenfolge, müssen Sie möglicherweise vor dem Vergleich auf eine Transformation vorbereitet werden, um die Dokumente zu normalisieren.

Michael Kay
quelle
2

Gute Antwort hier:

Frage: Wie kann ich zwei XML-Dateien unterscheiden? | Super User

Antwort: Wie kann ich zwei XML-Dateien unterscheiden? | Super User

$ xmllint --format --exc-c14n one.xml > 1.xml
$ xmllint --format --exc-c14n two.xml > 2.xml
$ diff 1.xml 2.xml

Entschuldigung für die Nichteinhaltung der Serverfehlerkonventionen ... Ich bin sicher, jemand wird mich informieren und ich werde entsprechende Änderungen vornehmen.

Troy Folger
quelle
1

Python-basiert xmldiffscheint eine sehr attraktive Lösung zu sein. Es wird behauptet, "Unterschiede zwischen zwei XML-Dateien zu extrahieren und eine Reihe von Grundelementen zurückzugeben, die auf den Quellbaum angewendet werden sollen, um den Zielbaum zu erhalten."

Beispiel:

a1.xml

<root>
</root>

a2.xml

<root attr="test1">
</root>

xmldiff a1.xml a2.xml::

[append-first, /,
<root attr="test1"/>
]
[remove, /root[2]]
Hirschjäger
quelle
1

Ich habe dafür ein einfaches Python-Tool namens geschrieben xmldiffs:

Vergleichen Sie zwei XML-Dateien, wobei Sie die Reihenfolge der Elemente und Attribute ignorieren.

Verwendungszweck: xmldiffs [OPTION] FILE1 FILE2

Alle zusätzlichen Optionen werden an den diffBefehl übergeben.

Erhalten Sie es unter https://github.com/joh/xmldiffs

joh
quelle
0

Es gibt kommerzielle und kostenlose Tools, die "XML-fähig" sind und ohne großen Aufwand das tun, was Sie brauchen. Es gibt anscheinend auch ein Eclipse-Plugin , das XML vergleicht.

Alternativ können Sie die Felder auch über xsl: sort oder durch Angabe einer Sequenzreihenfolge in Ihrer XSD sortieren (wodurch vorhandene Dokumente per Definition ungültig werden). Anschließend können Sie beide Dokumente "normalisieren", bevor Sie sie mit einem nicht xml-fähigen Diff-Tool vergleichen. Durch das Normalisieren werden zuerst alle Formatierungsunterschiede entfernt, die sich nicht auf den tatsächlichen Inhalt des XML auswirken. (Stellen Sie sich vor, Sie wenden einen Filter im XML-Codestil an.)

Chris Nava
quelle