XML – ćwiczenia 15: Parsowanie strumieniowe i JAXB.

Wszystkie przykładowe programy (proszę uaktualnić):

Referencje

Oba omawiane dzisiaj standardy powstały (JAXB wcześniej, StAX później) w związku z „webserwisami”. Są częścią Java Web Services Developer Pack, Java Enterprise Edition i projektu GlassFish, a niedawno zostały dodane do standardowej platformy Java Standard Edition 6. Ponadto StAX został dodany do wersji 1.4 standardu JAXP.

Przykłady

Można przejrzeć i uruchomić przykłady, które pochodzą z tego tutoriala.

Skrypty Anta zakładają, że mamy zainstalowaną Java Enterprise Edition. Same programy dałoby się uruchomić z dołączonymi tylko niektórymi jarami z JWSDP albo w Java SE 6.

Na students dostępne są wymagane biblioteki JEE oraz tutorial z odpowiednio zmieninymi ścieżkami w konfiguracji. Aby uruchomić przykłady na students wykonaj poniższe czynności:

  1. Zaloguj się pod Linuxem.
  2. Skopiuj i rozpakuj zmieniony tutorial:

    cd

    cp ~czarnik/jwstutorial20.zip .

    unzip jwstutorial20.zip

  3. Uruchom przykład JAXB:

    cd ~/jwstutorial20/examples/jaxb/unmarshal-read

    ant

  4. Uruchom przykład StAX:

    cd ~/jwstutorial20/examples/stax/cursor

    ant

  5. Pozostałe przykłady uruchamia się analogicznie.

    Gdyby jednak coś nie działało, być może należy zmienić ścieżkę (na własny katalog) w drugiej linii pliku jwstutorial20/examples/common/build.properties.

Wiązanie XML (w Javie)

Wiązanie XML w języku programowania (u nas w Javie) to pomysł, aby schematom dokumentów XML (DTD, XML Schema itp.) odpowiadały hierarchie klas, a instancjom dokumentów konkretne obiekty (z obiektami – podelementami itd., tworząc strukturę drzewiastą).

Dokument zgodny ze schematem można wczytać do pamięci (unmarshalling), a drzewo obiektów zapisać do dokumentu (marshalling).

Interfejs dostępu do drzewa jest zależny od schematu, ale dzięki temu jest wygodniejszy. Np. elementowi osoba, który może zawierać jeden podelement nazwisko i wiele podelementów imię (oba typu xs:string) będzie odpowiadała klasa z metodami List<String> getImię() i String getNazwisko(). Ponadto wartości od razu są tego typu Javy, który odpowiada zadeklarowanemu typowi XML Schema.

Nie ma potrzeby pamiętania nazw elementów i atrybutów (po prostu widać jakiego są typu), w wielu przypadkach można też uniknąć tworzenia list i słowników, dzięki temu wiązanie XML jest mniej pamięciochłonne i szybsze niż DOM.

JAXB

Standard Java API for XML Binding jest realizacją idei „wiązania XML” w Javie, został opracowany przez Suna, obecnie jest projektem open-source.

Niedawno JAXB został włączony do platformy Java Standard Edition (do wersji 6).

W najnowszej wersji JAXB istnieje także możliwość generowania schematu na podstawie klas Javy (aby odzwierciedlenie było jak najlepsze, klasy powinny posiadać odpowiednią strukturę; aby mieć większą kontrolę nad tym procesem, należy używać specjalnych anotacji w Javie).

Typowe kroki implementacji aplikacji używającej JAXB

  1. Przygotowanie schematu dokumentów.
  2. Kompilacja schematu narzędziem XJC, generuje klasy Javy odpowiadające typom zdefiniowanym w schemacie.

  3. Napisanie samej aplikacji korzystając z:

    • uniwersalnej części API JAXB,
    • klas wygenerowanych przez XJC.
  4. Uwaga! Zmiana schematu po napisaniu aplikacji może spowodować konieczność znacznych zmian w kodzie.

Parsowanie strumieniowe

Parsowanie strumieniowe to sposób czytania dokumentu XML, w którym użytkownik parsera „prosi” parser o kolejne zdarzenie, o wczytanie kolejnego fragmentu dokumentu.

Daje to bardziej intuicjny przepływ sterowania niż w SAX, gdzie to parser „zarzuca” użytkownika zdarzeniami, które ten musi obsłużyć.

Jednocześnie zachowane są największe zalety SAX: szybkość (brak zbędnych czynności) i możliwość przetwarzania dokumentów nie mieszczących się w pamięci.

Streaming API for XML (StAX)

Standard Streaming API for XML jest realizacją idei „parsowania strumieniowego” w Javie, został opracowany w ramach JSR 173, a implementacja parsera była znana także jako Sun Java Streaming XML Parser (SJSXP).

Niedawno StAX został dołączony do wersji 1.4 standardu JAXP i włączony do platformy Java Standard Edition (do wersji 6).

StAX pozwala na czytanie oraz zapisywanie dokumentów XML. Ze standardu można korzystać zasadniczo na dwa sposoby:

  • za pomocą kursora – interfejsy ze Stream w nazwie. Niejawnym kursorem przechodzimy do kolejnych węzłów dokumentu, o tym w jakim węźle jesteśmy możemy się dowiedzieć metodą getEventType, a inne metody get... zwracają wartości (np. nazwę węzła, wartość węzła tekstowego / atrybutu). Ten sposób jest najbardziej efektywny, nie zużywa niepotrzebnych zasobów, nadaje się więc do takich zastosowań jak aplikacje J2ME.
  • za pomocą zdarzeń – interfejsy ze Stream w nazwie. Tutaj metodą nextEvent pobieramy kolejne zdarzenie – obiekt typu XMLEvent. Różne zdarzenia będą miały różne konkretne typy (zobacz pakiet javax.xml.stream.events). Ten sposób umożliwia bardziej „eleganckie” programowanie obiektowe w zastosowaniach gdzie oszczędność zasobów nie jest aż tak istotna.

Valid XHTML 1.1Valid CSS