XML-Zusammenführung leicht gemacht

Manchmal scheint es so, als würden Sie mehr Zeit mit der Bearbeitung von XML-Dateien verbringen als mit dem Schreiben von Java-Code. Daher ist es sinnvoll, einen oder zwei XML-Wrangler in Ihrer Toolbox zu haben. In diesem Artikel bietet Laurent Bovet einen Einstieg in XmlMerge, ein Open Source-Tool, mit dem Sie XPath-Deklarationen verwenden können, um XML-Daten aus verschiedenen Quellen zusammenzuführen und zu bearbeiten.

Als Java-Entwickler verwenden Sie täglich XML in Ihren Build-Skripten, Bereitstellungsdeskriptoren, Konfigurationsdateien, objektrelationalen Zuordnungsdateien und vielem mehr. Das Erstellen all dieser XML-Dateien kann mühsam sein, ist aber keine besondere Herausforderung. Manipulieren oder ZusammenführenDie in solchen unterschiedlichen Dateien enthaltenen Daten können jedoch schwierig und zeitaufwändig sein. Möglicherweise bevorzugen Sie die Verwendung mehrerer Dateien, die in verschiedene Module aufgeteilt sind. Sie sind jedoch auf eine große Datei beschränkt, da dies das einzige Format ist, das der beabsichtigte XML-Benutzer verstehen kann. Möglicherweise möchten Sie bestimmte Elemente in einer großen Datei überschreiben, aber stattdessen den gesamten Inhalt der Datei replizieren. Möglicherweise fehlt Ihnen nur die Zeit, um die XSL-Transformationen (XSLT) zu erstellen, mit denen sich XML-Elemente in Ihren Dokumenten einfacher bearbeiten lassen. Wie dem auch sei, nichts scheint so einfach zu sein, wie es sein sollte, wenn es darum geht, die Elemente in Ihren XML-Dateien zusammenzuführen.

In diesem Artikel stelle ich ein Open Source-Tool vor, das ich erstellt habe, um viele der häufig auftretenden Probleme beim Zusammenführen und Bearbeiten von Daten aus verschiedenen XML-Dokumenten zu lösen. EL4J XmlMerge ist eine Java-Bibliothek unter der LGPL-Lizenz, die das Zusammenführen von Elementen aus verschiedenen XML-Quellen erleichtert. Während XmlMerge Teil des EL4J-Frameworks ist, können Sie es unabhängig von EL4J verwenden. Alles, was Sie benötigen, um das XmlMerge-Dienstprogramm über Ihre Befehlszeile auszuführen, ist JDK 1.5 oder höher.

In der folgenden Diskussion erfahren Sie, wie Sie XmlMerge für eine Vielzahl gängiger XML-Zusammenführungsszenarien verwenden, darunter das Zusammenführen von zwei XML-Dateien, das Zusammenführen von XML- ResourceDateidaten aus verschiedenen Quellen, um zur Laufzeit eine Spring Bean zu erstellen, und das Kombinieren von XmlMerge und Ant zum Erstellen einer automatisierter Bereitstellungsdeskriptor zur Erstellungszeit. Ich werde Ihnen auch zeigen, wie Sie XPath-Deklarationen und integrierte Aktionen und Matcher verwenden , um die Behandlung bestimmter Elemente während einer XML-Zusammenführung festzulegen. Ich werde mit einem Blick auf den einfachen Zusammenführungsalgorithmus von XmlMerge schließen und Möglichkeiten vorschlagen, wie er für speziellere XML-Zusammenführungsvorgänge erweitert werden kann.

Sie können XmlMerge jetzt herunterladen, wenn Sie den Beispielen folgen möchten.

XML-Dateien zusammenführen

In Listing 1 sehen Sie das sehr häufige (und stark vereinfachte) Beispiel für zwei XML-Dateien, die zusammengeführt werden müssen.

Listing 1. Zwei XML-Dateien, die zusammengeführt werden müssen

File1.xml File2.xml

Listing 2 zeigt die Befehlszeileneingabe zum Zusammenführen dieser beiden Dateien mit dem Dienstprogramm XmlMerge, gefolgt von der resultierenden Ausgabe.

Listing 2. Die beiden XML-Dateien wurden mit XmlMerge zusammengeführt

~ $ java -jar xmlmerge-full.jar file1.xml file2.xml         ~ $

Dieses erste Beispiel für das Zusammenführen ist sehr einfach, aber Sie haben möglicherweise bemerkt, dass die Reihenfolge, in der die Dateien zusammengeführt werden, wichtig ist. Wenn Sie die Reihenfolge ändern, können Sie unterschiedliche Ergebnisse erhalten. (Später in diesem Artikel sehen Sie ein Beispiel dafür, was passiert, wenn Sie die Reihenfolge von zwei zusammenzuführenden Dateien ändern.) Um die Dateien in Ordnung zu halten, verwendet XmlMerge den Begriff Original für das erste Dokument und Patch für das zweite. Dies ist leicht zu merken, da das Patch-Dokument immer mit dem Original zusammengeführt wird.

Zusammenführen von XML-Dateien aus verschiedenen Quellen

Sie können das XmlMerge-Dienstprogramm an einer beliebigen Stelle in Ihrem Java-Code implementieren und damit Daten aus verschiedenen Quellen in einem neuen, nützlichen Dokument zusammenführen. In Listing 3 habe ich damit eine Datei aus meinem Anwendungsdateisystem und den Inhalt einer Servlet-Anforderung in einem einzelnen Dokumentobjektmodell (DOM) zusammengeführt.

Listing 3. Zusammenführen von Client- und Server-XML zu einem DOM

XmlMerge xmlMerge = new DefaultXmlMerge(); org.w3c.dom.Document doc = documentBuilder.parse( xmlMerge.merge( new FileInputStream("file1.xml"), servletRequest.getInputStream()));

Erstellen von Spring Framework-Ressourcen zur Laufzeit

In einigen Fällen ist es hilfreich, XmlMerge und das Spring Framework zu kombinieren. Beispielsweise wurde die Resourcein Listing 4 gezeigte Spring Bean zur Laufzeit erstellt, indem separate XML-Dateien zu einem einzigen XML-Stream zusammengeführt wurden. Sie können dann die ResourceBean verwenden, um andere Ressourcen für die objektrelationale Zuordnung, die Dokumentgenerierung und mehr zu konfigurieren.

Listing 4. Eine Spring Resource Bean

     ch/elca/el4j/tests/xmlmerge/r1.xml     ch/elca/el4j/tests/xmlmerge/r2.xml            

Generieren eines automatisierten Bereitstellungsdeskriptors zur Erstellungszeit

Sie haben Ant wahrscheinlich verwendet, um Ihre Builds zu automatisieren. Wie wäre es mit einer Kombination mit XmlMerge, um beim Erstellen einen XML-Bereitstellungsdeskriptor zu generieren? Listing 5 zeigt die XmlMergeTaskArbeit.

Listing 5. XmlMergeTask generiert einen Deployment-Deskriptor