Nasza strona używa cookies. Dowiedz się więcej o celu ich używania i zmianie ustawień w przeglądarce. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

Transformacja XML w Javie

Poznaj zagadnienie transformacji XML oraz podstawowe możliwości Javy tym w zakresie.

Choć sam XML należy do technologii, bez których trudno wyobrazić sobie funkcjonowanie większości współczesnych systemów informatycznych (wystarczy wspomnieć, że jest on fundamentem dla narzędzi takich jak AJAX, web services czy dla plików konfiguracyjnych Javy, Mavena itd.), to jednak wydaje się, że zagadnienia związane z jego funkcjonowaniem wciąż sytuują się gdzieś na uboczu zainteresowania specjalistów IT. 

W przeciwieństwie do języków programowania, które pozwalają na implementowanie złożonych funkcjonalności czy atrakcyjnych wizualnie technologii frontendowych, XML postrzegany bywa jako jedynie proste narzędzie do przechowywania danych. Warto jednak podkreślić, że XML jest równocześnie narzędziem niezwykle uniwersalnym i charakteryzującym się ogromnym potencjałem. Ustandaryzowana struktura XML jest znakomitym materiałem do przekształceń na większość formatów, w których możemy prezentować dane użytkownikowi (HTML, pdf, docx itd.).

Popularność tego języka znaczników sprawia, że dla wielu języków programowania istnieją gotowe biblioteki pozwalające na konwertowanie plików XML. Poniżej przedstawię podstawowe zagadnienia związane z dokonywaniem tego rodzaju transformacji, a także zaprezentuję, w jaki sposób dokonać prostej konwersji XML w Javie.

Przykładowy dokument XML, który posłużyć może jako źródło danych do transformacji, wyglądać może następująco:

Jak łatwo zauważyć, jest to dokument przechowujący informacje o uczestnikach pewnej konferencji:

  • imię i nazwisko uczestnika (name),
  • informację na ile dni zakupione zostały bilety (bookedDays),
  • informację, czy uczestnik zamówił pamiątkową koszulkę (tShirt),
  • oraz informację, czy należność za bilety i koszulkę została już uiszczona.


W każdym dokumencie XML wyodrębnić można dwa podstawowe elementy: nagłówek (część zawierająca informacje przeznaczone dla analizatora składni, które określają reguły przetwarzania dokumentu) oraz właściwa treść dokumentu. W prezentowanym przykładzie rolę nagłówka pełni:

W praktyce nagłówki XML bywają bardziej rozbudowane (np. o deklaracje przestrzeni nazw czy typu dokumentu), jednak dla naszch potrzeb powyższy przykład jest całkowicie wystarczający.

Zakres treści każdego dokumentu XML wyznaczany jest przez element korzenia (ang. root element), którym w powyższym przykładzie jest: <conference>. Specyfikacja XML nie stawia żadnych specjalnych wymagań w odniesieniu do elementu korzenia, dzięki czemu możliwe jest np. włączanie korzenia XML z jednego dokumentu w strukturę elementów dokumentu nadrzędnego (wówczas korzeń dokumentu włączanego staje się normalnym elementem dokumentu, do którego następuje włączenie). Wszystkie elementy XML tworzone są poprzez umieszczenie ich nazwy w nawiasach ostrych (np.: <participant>, <name>). Nazwa rozpoczynać musi się od litery lub znaku podkreślenia oraz nie może zawierać spacji.

Sukces, jaki odniósł XML, wynika m.in. z łatwości, z jaką dokonywać można przekształceń danych zapisanych w tym formacie. Reguły takich transformacji opisane zostały w trzech odrębnych rekomendacjach, które jednak w praktyce stosowane są łącznie, zaś granica pomiędzy nimi ulega zatarciu. Z uwagi na to w niniejszym artykule posługiwać będziemy się łącznie pojęciem transformacji XSL w znaczeniu całej „rodziny” specyfikacji przekształcania dokumentów XML.

Transformata XSL do zaprezentowanego wcześniej dokumentu przybrać może następującą postać:

Podstawowym elementem, na który należy zwrócić uwagę, patrząc na powyższy dokument, jest szablon, czyli xsl:template. W toku przekształcenia dopasowywany jest on do każdego elementu XML, zawierającego dane, które mają być w jakiś sposób przetworzone. Dopasowanie szablonu do konkretnego elementu odbywa się poprzez przypisanie jego nazwy jako wartości atrybutu match. W przypadku naszej transformaty dopasowanie następuje do elementu conference, a zatem to od niego wyznaczać będziemy ścieżki względne w obrębie części szablonu.

Załóżmy, że dane zawarte w pliku XML przedstawić chcemy w dokumencie HTML, w formie tabeli, w której poszczególne kolumny prezentować będą:

  • dane uczestnika,
  • liczbę dni, na które dokonał rezerwacji,
  • informację, czy zamówił on koszulkę,
  • łączną należność, którą musi uiścić dany uczestnik; przy czym każdy dzień konferencji kosztuje 50 zł, zaś osoby chcące otrzymać koszulkę muszą zapłacić za nią kolejne 20 zł,
  • informację czy należność została uiszczona.


Punktem wyjścia dla osiągnięcia takiego rezultatu jest stworzenie tabeli za pomocą HTML-owego znacznika <table>. Następnie tworzymy wiersz nagłówkowy, z tytułami poszczególnych kolumn:

Aby wypełnić wiersze z danymi, użyć możemy pętli for-each, która dla każdego elementu participant (czyli dla każdego uczestnika konferencji), wykona zawarte w niej instrukcje:

W każdej iteracji pętli budowany jest jeden wiersz oraz wypełniane są pola przypisane do poszczególnych kolumn. Wartości pierwszych trzech kolumn przenoszone są z dokumentu XML bezpośrednio, za pomocą atrybutu select, któremu przypisujemy wartość odpowiedniego elementu z dokumentu XML:

Wartość kolumny „Należność” nie znajduje bezpośredniego przełożenia w XMLu, zatem należy ją odpowiednio przygotować przed zaprezentowaniem. Jak wspomniane zostało powyżej, należność wyliczana jest jako iloczyn ceny biletu i liczby dni uczestnictwa, powiększona o ewentualny koszt koszulki. Informacje o cenie biletu i t-shirtu, których nie ma w XMLU wprowadzamy za pomocą zmiennych:

Analogicznie wprowadzamy zmienną days reprezentującą liczbę dni, na które zakupione zostały bilety (wykorzystamy ją do obliczeń):

oraz zmienną informującą, czy uczestnik zakupił t-shirt:

Dodatkowo do zmiennej result przypisujemy wynik ilorazu liczby dni, na które zakupiono bilety oraz ceny biletu:

Dysponując tymi danymi możemy stworzyć algorytm, który wyświetli result, jeżeli użytkownik nie zakupił koszulki lub result powiększony o cenę koszulki (tShirtPrice), jeżeli dana osoba takiego zakupu dokonała. W XSL zrealizować można to przy pomocy struktury when-otherwise, która powinna zawierać się w elemencie choose:

Jak można zauważyć, dane w XMLu przechowywane są za pomocą liczby, zaś my chcielibyśmy wyświetlić je jako cenę w złotych. W tym celu wprowadzamy zmienną reprezentującą nazwę waluty:

Następnie doklejamy do liczby na jeden z dwóch sposobów: albo ponownie wykorzystując atrybut select, albo korzystając z metody concat() (oba sposoby widać na powyższym przykładzie).

W ostatniej kolumnie chcielibyśmy pokazać, czy dany uczestnik opłacił już koszty udziału w konferencji. Niezbędne dane zawarte są w XMLu (element payed), jednak dla przejrzystości warto by wyróżnić na czerwono rekordy dotyczące uczestników, którzy jeszcze zalegają z zapłatą. W tym celu tworzymy atrybut style, który zmienia kolor czcionki na czerwony dla „nieopłaconych” rekordów. Rekordy takie odfiltrowujemy przy pomocy struktury sterującej if:

Dysponując tak przygotowanymi dokumentami XML i XSL możemy dokonać transformacji danych do formatu HTML za pomocą Javy. Niezbędne do tego klasy znajdują się w pakiecie javax.xml.transform, a zatem nie jest konieczne pobieranie żadnych dodatkowych bibliotek. Przede wszystkim stworzyć należy obiekty reprezentujące dokument XML z danymi oraz wynikowy plik HTML, np. w ten sposób:

Konieczne będzie także stworzenie obiektu reprezentującego arkusz XSL:

W prezentowanym przykładzie wszystkie dane przekazaliśmy jako argumenty wywołania programu (args[ ]).

W kolejnym kroku tworzymy obiekt TransformerFactory:

który posłuży nam do utworzenia silnika przekształceń (Transformer):

Obiekt StreamSource zawierający dane pliku XSL przekazujemy jako argument metody newTransformer(), tak jak to widać na powyższym przykładzie.

Teraz zostaje już tylko dokonać transformacji:

I już można cieszyć oczy wygenerowanym HTML-em:

Zaprezentowane wyżej informacje i przykłady to jedynie namiastka możliwości transformacji XML w Javie. Mam jednak nadzieję, że wykazały, jak przydatną i wszechstronną technologią jest XML, a także dowiodły, jak wielkie możliwości przekształceń on daje.  


Żródło artykułu

Zobacz kogo teraz szukają