Łatwe scalanie XML

Czasami wydaje się, że spędzasz więcej czasu na manipulowaniu plikami XML niż na pisaniu kodu Java, więc sensowne jest posiadanie jednego lub dwóch kontrolerów XML w swoim zestawie narzędzi. W tym artykule Laurent Bovet przedstawia XmlMerge, narzędzie typu open source, które pozwala używać deklaracji XPath do scalania danych XML z różnych źródeł i manipulowania nimi.

Jako programista Java codziennie korzystasz z XML w skryptach budowania, deskryptorach wdrażania, plikach konfiguracyjnych, plikach mapowania obiektowo-relacyjnego i nie tylko. Tworzenie wszystkich tych plików XML może być żmudne, ale nie jest szczególnie trudne. Manipulowanie lub scalaniedane zawarte w tak różnych plikach mogą być jednak trudne i czasochłonne. Możesz chcieć użyć kilku plików podzielonych na różne moduły, ale jesteś ograniczony do jednego dużego pliku, ponieważ jest to jedyny format, jaki może zrozumieć docelowy konsument XML. Możesz chcieć przesłonić określone elementy w dużym pliku, ale zamiast tego skopiuj całą zawartość pliku. Może po prostu brakuje Ci czasu na tworzenie przekształceń XSL (XSLT), które ułatwiłyby manipulowanie elementami XML w dokumentach. W każdym razie wydaje się, że nic nie jest tak łatwe, jak powinno, jeśli chodzi o scalanie elementów w plikach XML.

W tym artykule przedstawiam narzędzie open source, które stworzyłem, aby rozwiązać wiele typowych problemów związanych ze scalaniem i manipulowaniem danymi z różnych dokumentów XML. EL4J XmlMerge to biblioteka Java na licencji LGPL, która ułatwia łączenie elementów z różnych źródeł XML. Chociaż XmlMerge jest częścią frameworka EL4J, można go używać niezależnie od EL4J. Wszystko, czego potrzebujesz, aby uruchomić narzędzie XmlMerge z wiersza poleceń, to JDK 1.5 lub nowszy.

W poniższej dyskusji dowiesz się, jak używać XmlMerge do różnych typowych scenariuszy łączenia XML, w tym łączenia dwóch plików XML, scalania danych plików XML z różnych źródeł w celu utworzenia Resourcekomponentu bean Spring w czasie wykonywania oraz łączenia XmlMerge i Ant w celu utworzenia zautomatyzowany deskryptor wdrażania w czasie kompilacji. Pokażę również, jak używać deklaracji XPath oraz wbudowanych akcji i dopasowań, aby określić sposób traktowania określonych elementów podczas scalania XML. Na zakończenie przyjrzę się prostemu algorytmowi scalania XmlMerge i zasugeruję sposoby jego rozszerzenia na bardziej wyspecjalizowane operacje scalania XML.

Możesz pobrać XmlMerge teraz, jeśli chcesz postępować zgodnie z przykładami.

Scalanie plików XML

Na liście 1 widzisz bardzo powszechny (i znacznie uproszczony) przykład dwóch plików XML, które muszą zostać scalone.

Listing 1. Dwa pliki XML, które należy scalić

File1.xml File2.xml

Listing 2 przedstawia dane wejściowe wiersza polecenia służące do scalenia tych dwóch plików za pomocą narzędzia XmlMerge, a następnie wynikowe dane wyjściowe.

Listing 2. Dwa pliki XML połączone za pomocą XmlMerge

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

Ten pierwszy przykład scalania jest bardzo prosty, ale być może zauważyłeś, że kolejność łączenia plików jest ważna. Jeśli zmienisz kolejność, możesz uzyskać inne wyniki. (W dalszej części artykułu zobaczysz przykład tego, co się dzieje, gdy zmieniasz kolejność dwóch plików do scalenia). Aby zachować porządek w plikach, XmlMerge używa terminu oryginał dla pierwszego dokumentu i poprawki dla drugiego. Jest to łatwe do zapamiętania, ponieważ dokument poprawki jest zawsze scalany z oryginałem.

Scalanie plików XML z różnych źródeł

Możesz zaimplementować narzędzie XmlMerge w dowolnym miejscu kodu Java i użyć go do scalenia danych z różnych źródeł w nowy, użyteczny dokument. Na Listingu 3 użyłem go do scalenia pliku z mojego systemu plików aplikacji i treści żądania serwletu w jeden model obiektowy dokumentu (DOM).

Listing 3. Łączenie XML klienta i serwera w DOM

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

Tworzenie zasobów Spring Framework w czasie wykonywania

W niektórych przypadkach przydatne jest połączenie XmlMerge i Spring Framework. Na przykład Resourcefasola Spring pokazana na liście 4 została utworzona w czasie wykonywania przez scalenie oddzielnych plików XML w jeden strumień XML. Następnie można użyć tego Resourcekomponentu bean do skonfigurowania innych zasobów do mapowania obiektowo-relacyjnego, generowania dokumentów i nie tylko.

Listing 4. Fasola Spring Resource

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

Generowanie automatycznego deskryptora wdrażania w czasie kompilacji

Prawdopodobnie użyłeś Anta do zautomatyzowania swoich kompilacji. Co powiesz na połączenie go z XmlMerge w celu wygenerowania deskryptora wdrażania XML w czasie kompilacji? Listing 5 przedstawia XmlMergeTaskw pracy.

Listing 5. XmlMergeTask generuje deskryptor wdrażania