2009-01-09 6 views
11

Ich denke, ich habe ein ziemlich einzigartiges Problem zu lösen. Nun, ich kann nicht genug Informationen mit Google finden. Also hier geht es,XML Diff und Merge

Ich arbeite an einer Java EE SOA-Anwendung, die XML-Dokumente als XML mit Oracle XML DB speichert. Immer wenn sich das XML ändert, inkrementiere ich die Version und werfe die vorherige Version in eine andere Tabelle.

Die Anforderung ist jetzt, ich sollte die Unterschiede zwischen 2 Versionen als XML speichern, anstatt das gesamte XML-Dokument.

  1. Gibt es eine Java-Bibliothek, die einen XML-Vergleich durchführen kann? (XMLUnit, ...?)
  2. Gibt es ein Standard-XML-Schema zum Erfassen von XML-Unterschieden?
  3. Welche Transformationstechnologie kann ich verwenden, um die "Unterschiede" auf ein XML anzuwenden, um zwischen den Versionen hin und her zu wechseln? (XSLT, Groovy, ....?)

Ich schätze Ihre Zeit.

+1

ein Standardformat anbelangt, so haben Sie [RFC 5261] (https://tools.ietf.org/html/rfc5261) gesehen? - Es scheint, dass es Ihrer Frage um ein bisschen vorausgeht - besser spät als nie. – BrainSlugs83

Antwort

4

Es gibt eine beliebige Anzahl von Open-Source-XML-Vergleichswerkzeugen, die in Java geschrieben sind. Eine Liste solcher Werkzeuge ist here.

9

In meinem letzten Job hatten wir ein ähnliches Problem: Wir mussten Änderungen, Einfügungen und Löschungen bestimmter Elemente zwischen zwei XML-Dateien erkennen. Die Dateien waren nicht willkürlich XML; Sie mussten sich an unsere XSD halten.

Unsere Lösung bestand darin, eine Art Merge-Sort zu implementieren: Parsen Sie die Dateien (verwenden Sie einen SAX-Parser, nicht einen DOM-Parser, um beliebig große Dateien zuzulassen) und speichern Sie die analysierten Daten in separaten HashMaps. Dann verglichen wir die Inhalte der zwei Karten mit einem Merge-Sort-Algorithmus.

Natürlich, je größer die Dateien wurden, desto mehr Speicherdruck erlebten wir, so schrieb ich schließlich eine FileHashMap-Klasse, die den Wert der HashMap-Wert auf Dateien mit wahlfreiem Zugriff geschoben. Obwohl diese Lösung theoretisch langsamer war, konnten unsere Vergleiche mit sehr großen Dateien ohne Thrash- oder OutOfMemoryError-Bedingungen arbeiten. (Eine Version dieser FileHashMap-Klasse ist in dieser Bibliothek verfügbar:

)

Ich habe keine Ahnung, ob das, was ich gerade beschrieben habe, auch nur entfernt ist, aber ich dachte, ich würde es teilen, nur für den Fall.

Viel Glück.

8

Seitliche Anmerkung: Es gibt jetzt ein Standardformat für XML-fähige "Patches", in RFC 5261. Es gibt mindestens eine kostenlose Software, xmlpatch, die es implementiert. Es ist in C geschrieben, Sie können es von Java aus aufrufen.

+0

Hmm, es sieht so aus, als wäre der von Ihnen angegebene Link libxmlpatch, was eine C++ - Bibliothek ist. Wo ist das Befehlszeilen-Tool (und Windows-Binärdatei)? – BrainSlugs83