DOM SAX XSLT w Java

Transkrypt

DOM SAX XSLT w Java
Uniwersytet Łódzki
Wydział Matematyki i Informatyki,
Katedra Analizy Nieliniowej
Procesowanie
dokumentów XML
Programowanie w Javie 2
mgr inż. Michał Misiak
Cechy XML






Sformalizowany zapis informacji – restrykcyjne reguły
Uniwersalność – możliwość zapisania wszelkich
informacji (MathXML, SVG, …)
Rozszerzalność – struktura informacji łatwa do
rozszerzania z możliwością wykorzystania wcześniej
zdefiniowanych struktur
Czytelność – dokumenty XML są czytelne dla człowieka,
a jednocześnie łatwe w analizie dla maszyny
Międzynarodowość – możliwość korzystania z wielu
stron kodowych lub UTF-8
Prostota – łatwość zrozumienia tworzenia dokumentów
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Cechy XML - wady




Ograniczenia związane z hierarchiczną strukturą
danych. Możliwość przedstawienia jednego typu relacji.
W przypadku występowania większej liczby relacji trzeba
korzystać z np. identyfikatorów
Nadmiarowość informacji – znaczny narzut na znaczniki
przechowujące metainformacje
Problemy z wydajnością przetwarzania – ograniczenia
pamięciowe dla dużych dokumentów
Brak poprawnej implementacji standardów XML w
aplikacjach
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Przyczyny popularności




Duża popularność i chęć używania języków znakowania
(SGML, HTML – powszechność)
Sformalizowany sposób wymiany informacji
Rozwój idei e-business (ebXML,
XML nie wnosi nic nowego bo:



Idea języków znakowania stosunkowo stara (SGML)
Koncepcja hierarchicznych struktur danych również
Sukces XML – zaprezentował stare koncepcje w nowej
zrozumiałej i powszechnej formie
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Przetwarzanie dokumentów XML

Wykorzystanie dokumentów XML w aplikacjach
to:
 poznanie
struktury
 pobranie zawartości poszczególnych elementów

W celu optymalizacji czasu tworzenia aplikacji
korzystających z XML większość języków
definiuje własne API
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Rodzaje API

API do przetwarzania dokumentów w oparciu o:





DOM – Document Object Model – tworzenie struktury
dokumentu
SAX (Simple API for XML) – przetwarzanie dokumentu jako
strumienia zdarzeń
API zdefiniowane niezależnie od języka/platformy
W przypadku języka Javy: Java API for XML Processing
JAXP.
JAXP pierwszy raz był wykorzystane na platformie J2EE
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
XML Parser

XML Parser jest to procesor XML, który potrafi
czytać strumień XML i przedstawić go w
zrozumiałej formie dla aplikacji
Aplikacja XML
Parser XML
XML API
Dokument XML
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Poprawność dokumentu

Poprawność składniowa (well-formed):




Poprawność strukturalna (valid)




Zgodność z regułami składni XML – gramatyka XML:
Dokument niepoprawny składniowo nie może być przetworzony
przez parser
Brak możliwości wykorzystania zewnętrznych encji
Zgodność z definicją dokumentu (XML Schema, DTD) –
gramatyka dokumentu
Parsery walidujące
W większości praserów można ustalić poziom
sprawdzania poprawności dokumentów
Różnica w wydajności pomiędzy trybami pracy
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Parsery XML w Javie

Wiele implementacji tego samego API przez różnych
dostawców. Różnice w konfiguracji.




http://java.sun.com/xml/jaxp - tutorial
JAXP pozwala na integrację DOM API, SAX oraz
procesorów XSLT
JAXP oferuje mechanizm fabryki, który pozwala na
wytworzenie instancji prasera o wymaganej konfiguracji
Inne API dla XML w Javie:




JAXB - Java API for XML Binding
JAXR - Java API for XML Registries
JAXM - Java API for XML Messaging
JAX-RPC - Java API for XML-based RPC
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Document Object Model (1)




DOM interfejs do dokumentu XML, sposób na
reprezentację struktury dokumentu
Reprezentacja struktury dokumentu w postaci
drzewa
Rozwijany przez W3C od połowy lat 90, jak
część specyfikacji HTML. Pierwsza specyfikacja
DOM 1 – 1998
http://www.w3.org/DOM/
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Document Object Model (2)

Specyfikacja podzielona jest na poziomy (Level)
poziom 0 – zaimplementowany we
wszystkich przeglądarkach umożliwia dostęp do
podstawowych elementów (formularzy, obrazków)
 Poziom 1 – możliwość modyfikowania dołączania
węzłów. Dostępny z poziomu JavaScript
 Poziom 2 – obsługa zdarzeń i przestrzeni nazw
 Poziom 3 – 6 specyfikacji: Load and Save, XPath,
Views & Formatting, Requirment, Validation
 Nieoficjalny
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Model programistyczny dla DOM
zapisywanie
Dokument XML
Parser DOM
Tworzenie
drzewa
czytanie
Kontakty
Nawigacja
&
Edycja
Kontakt 1
Kontakt 2
Aplikacja
Imię
Nawisko
Adres
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
DOM w Javie



Interfejsy dla DOM zostały zdefiniowane w pakiecie:
org.w3c.dom
Standardowy parser znajduje się w pakiecie:
javax.xml.parsers
Utworzenie instancji parsera:




DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder parser = factory.newDocumentBuilder();
Document mydoc = parser.parse(args[0]);
Dokument DOM jest wyprowadzony i złożony z węzłów
Node
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Interfejs dla węzła








java.lang.String getNodeName() – zwraca nazwę węzła
short getNodeType() – zwraca typ węzła np.: ATTRIBUTE_NODE,
COMMENT_NODE, ELEMENT_NODE, TEXT_NODE.
java.lang.String getPrefix() – zwraca prefiks przestrzeni nazw lub
null w przypadku braku
boolean hasChildNodes() – sprawdza, czy dany węzeł posiada
dzieci
NodeList getChildNotes() – zwraca listę węzłów dzieci
boolean hasAttributes() – sprawdza czy węzeł ma atrybuty
NamedNodeMap getAttributes() – zwraca listę (dostęp po nazwach
atrybutów) z atrybutami węzła
java.lang.String getNodeValue() – zwraca wartość węzła w
zależności od jego typu dla TEXT_NODE zostanie zwrócony tekst.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Interfejs dla konkretnego typu
węzła

Obiekty odwzorowujące konkretny typ węzła:
 Element

Document, Entity, Processing-Instruction
Każdy z typów węzłów oferuje specyficzny
interfejs, do którego dostęp uzyskujemy po
prawidłowym zrzutowaniu węzła (zastosowanie
metody getNodeType())
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Pozostałe metody interfejsu dla
DOM







Node appendChild(Node newChild) – załącza nowy węzeł jako
dziecko dla aktualnego węzła
Node insertBefore(Node newChild, Node refChild) – wkleja nowy
węzeł na miejsce wskazane przez węzeł referencyjny
Node removeChild(Node oldChild) – usuwa węzeł dziecko
void setNodeValue(java.lang.String nodeValue) – umożliwia
ermöglicht es den Wert (=Text) eines Knotens zu ändern.
o void setPrefix(java.lang.String prefix)
setzt den Namespace für den Knoten.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Simple API for XML



Uproszone API do przetwarzania dokumentów XML
Wykorzystuje koncepcję przetwarzania zdarzeniowego
Zdefiniowano następujący zbiór podstawowych zdarzeń:







Otwarcie znacznika
Zamknięcie znacznika
Wystąpienie PCDATA (Parsable Character Data)
Wystąpienie CDATA (Character Data)
Wystąpienie Processing Instruction
Wystąpienie komentarza
Wystąpienie deklaracji encji
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Simple API for XML

Wady
 SAX
nie umożliwia nawigowania po dokumencie, a
tym samym na jego modyfikacje

Zalety
 Prostota
implementacji
 Możliwość przetwarzania złożonych dokumentów:
wczytywanie i walidowanie. Oszczędność pamięci.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Model programistyczny
czytanie
Parser DOM
start
Dokument XML
Wystąpienie
zdarzeń
handler
Aplikacja
handler
handler
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
SAX w Javie

Wymagane pakiety:
 org.xml.sax.*;


org.xml.sax.helpers.*;
Zdarzenia są automatycznie przekazywane do
Javy, która wywołuje wcześniej przygotowane
metody tzw. Handlers
Handlers muszą być wyprowadzone z klasy:
org.xml.sax.helpers.DefaultHandler
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Najważniejsze metody
DefaultHandler



void startDocument() – wołana na początku pracy
parsera
void endDocument() – sygnalizuje, że koniec
dokumentu został osiągnięty
void startElement(java.lang.String
uri,java.lang.String localName,
java.lang.String qName, Attributes
attributes) – sygnalizuje pojawienie się określonego
znacznika danego elementu. Parser przekazuje
następujące informacje do aplikacji: Namespace (uri),
Nazwa znacznika, prefiks (qName) jak również listę
atrybutów
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Najważniejsze metody
DefaultHandler (2)


void endElement( java.lang.String uri,
java.lang.String localName,
java.lang.String qName) – sygnalizuje koniec
znacznika dla danego elementu. Przekazywane są te
same parametry co dla startElement()
void characters(char[] ch, int start, int
length) – wywoływana w przypadku wystąpienia
tesktu w dokumencie. Tekst zostaje umieszczony w
tablicy char.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Konstrukcja parsera


Właściwą instancją parsera jest:
org.xml.sax.XMLReader. Jest to jedynie interfejs,
którego metody należy zaimplementować
Można skorzystać z fabryki:



XMLReader Parser =
XMLReaderFactory.createXMLReader("org.apache.xerces.parse
rs.SAXParser");
Należy wskazać handlers za pomocą metody:
setContentHandler()
Parser jest uruchamiany za pomocą metody parse(),
która jako argument otrzymuje URI
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
SAX vs. DOM




Brak konieczności tworzenia
drzewa niesie za sobą
ograniczone zasoby związane
z dyskiem
SAX dzięki temu może
parsować bardzo duże
dokumenty
Dzięki modelowi
zdarzeniowemu oraz braku
konieczności korzystania z
dysku możliwe jest parsowanie
XML ze strumienia
Bardzo prosty interfejs
programistyczny

DOM jest znacznie
potężniejszy w funkcjonalności




Nawigacja po dokumencie
Przetwarzanie
Tworzenie dokumentu
DOM często wykorzystuje SAX
do stworzenia modelu drzewa
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
SAX+DOM=SAXDOMIX

Nowe powołany do życia projekt open-source łączący
zalety i funkcjonalności obydwu parserów:



SAXDOMIX pozwala rozwiązywać np. problem zliczenia
(SAX) i posortowania (DOM) danych



Obiektowość DOM
Szybkość i prostota SAX
SAX buduje minimalny DOM wymagany do posortowania
danych
Pozwala to na oszczędność miejsca oraz przechwycenie
dodatkowych informacji podczas parsowania
http://www.devsphere.com/xml/saxdomix/
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Biblioteka JDOM




Specjalnie zaprojektowany dla Javy model
dokumentu
Zdefiniowany w JSR 102
JDOM łączy w sobie zalety SAX i DOM
Wspiera XSLT oraz XPath
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Deferred Parsing





Umożliwia parsowanie jedynie istotnych części
dokumentu
Podobny w działaniu do SAXDOMIX
Celem projektu jest budowa uniwersalnego
interfejsu do drzewa, który umożliwia również
przetwarzanie dużych dokumentów
Podejście takie oferuje parser xerces v2
http://xml.apache.org/xerces2-j/.
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Pull Parsing




Idea podobna do Deferred Parsing – parsowanie jedynie
tych części, które są konieczne
Możliwość przeskakiwania części dokumentu XML w
przeciwieństwie do SAX, który musi dokończyć
parsowanie dokumentu
Możliwość stworzenia dokumentu XML przy
wykorzystaniu interfejsu, który nie jest kompatybilny z
DOM
http://www.extreme.indiana.edu/xgws/xsoap/xpp/
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Podsumowanie

Przykładowe porównanie dostawców parserów:





http://xmlbench.sourceforge.net/index.php?page=results.php
W pracy: porównano różnego rodzaju metody
parsowania dla różnych scenariuszy.
Dla małych dokumentów najefektywniejszy okazał się
XPP. Mała biblioteka sprawia, że może być
wykorzystywany w rozwiązaniach mobilnych
Przetwarzanie olbrzymich dokumentów: SAX
Edycja dokumentu oraz częste nawigowanie: DOM
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Transformacje XSLT

TransformerFactory


static TransformerFactory newInstance()
Transformer newTransformer() – tworzy transformer kopiujący (np. do zapisu
drzewa DOM do pliku)
 newTransformer(Source src) – tworzy transformer z arkuszem styli
 setErrorListener(ErrorListener el)

Transformer

void transform(Source xmlSource, Result outputTarget)
Przykład:
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
public class xslt1ex {
public static void main(String[] args) throws Exception {
TransformerFactory fact = TransformerFactory.newInstance();
Transformer trans = fact.newTransformer(
new StreamSource("lenEx.xsl"));
trans.transform(new StreamSource("lenEx.xml"),
new StreamResult("lenEx.html"));
}
}
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Dziękuje!
Zapraszam na kolejne wykłady ;)
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008