Wszystkie przykładowe programy (proszę uaktualnić):
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.
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:
Skopiuj i rozpakuj zmieniony tutorial:
cd
cp ~czarnik/jwstutorial20.zip .
unzip jwstutorial20.zip
Uruchom przykład JAXB:
cd ~/jwstutorial20/examples/jaxb/unmarshal-read
ant
Uruchom przykład StAX:
cd ~/jwstutorial20/examples/stax/cursor
ant
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 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.
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).
Kompilacja schematu narzędziem XJC, generuje klasy Javy odpowiadające typom zdefiniowanym w schemacie.
Napisanie samej aplikacji korzystając z:
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.
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:
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.
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.