Wszystkie przykładowe programy:
API Javy (pakiety javax.xml.*
):
org.xml.sax
[.*
], javax.xml.parsers
.Standard JAXP opisuje podstawowe wsparcie dla przetwarzania XML w Javie, jest częścią platformy Java Standard Edition.
Standard określa klasy i interfejsy, z których bezpośrednio powinni korzystać programiści. Standard pozwala na używanie różnych implementacji poszczególnych składników bez jawnego używania klas implementacyjnych (odpowiada za to tzw. plugability layer). To, jaka implementacja zostanie wybrana, zależy od konfiguracji środowiska (klasy dostępne w ścieżce CLASSPATH oraz własności systemowe).
JAXP zawiera następujące składniki:
Transformer
),Na dzisiejszych zajęciach zajmiemy się składnikami nie omówionymi do tej pory.
W pakiecie javax.xml.transform
oraz podpakietach
zawarte są klasy i interfejsy stanowiące wsparcie dla przekształceń dokumentów.
Obiekt typu Transformer
odpowiada definicji przekształcenia, na przykład arkuszowi XSLT.
Wywołanie metody transform
tego obiektu powoduje przekształcenie dokumentu odczytanego z podanego źródła
i zapisanie wyniku przekształcenia do podanego wyjścia.
Zarówno wejściem jak i wyjściem przekształcenia może być jedna z poniższych reprezentacji dokumentu:
Obecnie można używać przekształceń identycznościowych lub stworzyć obiekt typu Transformer
na podstawie arkusza XSLT.
Standard JAXP 1.4 odnosi się do XSLT w wersji 1.0, ale, jak dowodzą doświadczenia,
implementacja Saxon pozwala na wykonywanie transformacji XSLT 2.0
w sposób zgodny z JAXP (wystarczy do CLASSPATH dodać plik saxon9.jar).
Przekształcenia identycznościowe mogą być wykorzystane do zmiany sposobu reprezentacji dokumentu, np. zbudowania drzewa DOM ze strumienia zdarzeń SAX, serializacji strumienia zdarzeń SAX lub drzewa DOM (bez użycia Load and Save).
Możliwość serializacji strumienia zdarzeń SAX pozwala na wykorzystanie filtrów SAX do zmiany dokumentów XML bez ich wczytywania do pamięci (co byłoby konieczne przy wykorzystaniu DOM lub JAXB).
Plik: Transformer1.java.
To przykład podstawowego wykorzystania transformera do wykonania przekształcenia XSLT.
Plik: Transformer2.java.
W tym przykładzie źródłem jest strumień zdarzeń SAX, bezpośrednio z parsera.
Plik: Transformer3.java.
W tym przykładzie zdarzenia SAX płyną z parsera, poprzez filtr, do transformera serializującego zdarzenia do pliku. W ten sposób dokument jest modyfikowany bez wczytywania go w całości do pamięci.
ważne
równym tak
i ich zawartość (podelementy i tekst),
natomiast zatrzymuje nieważne grupy i ich zawartość.
Chodzi o dokumenty zgodne ze schematem,
oto przykładowy dokument.
Klasa SAXTransformerFactory
, będąca podklasą TransformerFactory
,
umożliwia tworzenie, poza normalnymi Transformer
-ami, filtrów SAX realizujących
przekształcenie.
SAXTransformerFactory tf = (SAXTransformerFactory)SAXTransformerFactory.newInstance(); XMLFilter f = tf.newXMLFilter(new StreamSource("arkusz.xsl"));
TransfomerHandler
W przypadku strumienia zdarzeń SAX może zaistnieć potrzeba „biernej” obsługi zdarzeń
i przetwarzania ich zgodnie z arkuszem XSLT lub zamiany ich na inny rodzaj reprezentacji dokumentu XML.
Zwykły Transformer
inicjuje przetwarzanie, a co za tym idzie (w przypadku SAX) także parsowanie.
Obiekt typu TransfomerHandler
może być używany w roli ContentHandlera
,
który pozostaje podłączony do parsera (lub filtra) SAX i po prostu obsługuje zdarzenia
wtedy, gdy ktoś inny uruchomi parsowanie. Za pomocą setResult
ustala się cel przekształcenia.
Do tworzenia obiektów typu TransfomerHandler
oraz innych użytecznych w przypadku
SAX służy klasa SAXTransformerFactory
.
Napisz program używający filtra grup inaczej, korzystając z TransfomerHandler
.
Klasy i interfejsy związane z walidacją są umieszczone w pakiecie javax.xml.validation
.
Aby walidacja zgodnie z tym „nowym” interfejsem działała zwykle trzeba
włączyć obsługę przestrzenia nazw w parserze.
Obiekty typu Schema
to schematy, które definiują strukturę dokumentów XML.
Do tworzenia obiektów typu Schema
służą obiekty klasy SchemaFactory
.
Obiekty typu Schema
mogą być utworzone na podstawie schematów XML Schema,
ale także schematów Relax NG czy Schematron, o ile dana implementacja komponentu służącego do walidacji je obsługuje.
Obiekty typu Schema
mogą być wykorzystane do sprawdzania poprawności dokumentów podczas parsowania:
fabryce parserów (zarówno SAX jak i DOM) metodą setSchema
można wskazać schemat,
względem którego ma być walidowany dokument.
Validator
Z obiektu typu Schema
metodą newValidator
można uzyskać obiekt typu Validator
,
za pomocą którego można zwalidować dokument, nawet jeśli dokument nie jest dostępny jako plik,
a na przykład drzewo DOM czy strumień zdarzeń SAX. Do obsługi błędów walidacji należy użyć
obiektu typu ErrorHandler
, jak dla parsera SAX.
Walidacja może mieć wpływ na zawartość dokumentu, poprzez wstawienie domyślnych wartości atrybutów i normalizację białych znaków.
Dlatego do walidacji możemy użyć najbardziej ogólnej metody
Validator.validate(Source, Result)
,
która waliduje dokument podany w pierwszym argumencie a (potencjalnie zmieniony) wynik zwraca poprzez drugi argument.
Jak widać dozwolone są te same rodzaje źródeł i wyników, co dla transformerów, jednak tutaj wynik musi być tego samego rodzaju co źródło.
ValidatorHandler
W przypadku walidacji strumienia zdarzeń SAX czasami wygodniej jest użyć „biernego”
obiektu typu ValidatorHandler
(podobnie jak TransformerHandler
).
Metoda setContentHandler
pozwala do obiektu typu ValidatorHandler
dołączyć
ContentHandler
, który będzie odbierał zdarzenia reprezentujące zwalidowany dokument.
suma
, po przetestowaniu z oryginalnym schematem dodaj deklarację tego podelementu w schemacie i ponownie przetestuj. Spraw aby informacja o nie walidowaniu się była wypisywana lub miała wpływ na działanie. (Jeśli filtr tylko przesiewa grupy, inaczej spraw aby wynikowy dokument czasami nie przechodził walidacji).
JAXP 1.4 obejmuje wsparcie dla XPath 1.0.
Klasy i interfejsy stanowiące wsparcie dla XPath zostały umieszczone w pakiecie javax.xml.xpath
.
Do obliczania wyrażeń służą obiekty implementujące interfejs XPath
, można je uzyskać z obiektu klasy XPathFactory
.
Wartość wyrażenia XPath może być obliczona dla dokumentu dostępnego jako plik (lub ogólnie ciąg znaków) lub jako drzewo DOM. W pierwszym przypadku w celu obliczenia jednego wyrażenia parsowany jest cały dokument, co zwykle nie jest efektywnym rozwiązaniem, drugi przypadek jest możliwy do osiągnięcia tylko dla dokumentów mieszczących się w pamięci. Wyrażenie może być także obliczone w kontekście konkretnego węzła – należy go podać jako węzeł DOM.
Wynik wyrażenia można odebrać jako obiekt Javy typu najbardziej odpowiedniego dla wskazanego typu XPath (metoda typu Object
).
Węzły zwracane są jako węzły DOM. Typy atomowe w XPath 1.0 to jedynie liczby, napisy i boolean – zwracane są odpowiednie obiekty Javy.
Wynik można też odebrać zrzutowany od razu na String
(metoda typu String
).
Plik: XPathExample.java.
l
z ważnych grup (lub od razu ich węzłów tekstowych) i następnie zsumowanie wartości liczbowych. sum()
)