programowanie w javie 2 - kolos wikikolos.math.uni.lodz.pl/~archive/java 2/02 i 03 dom sax/dom sax...
TRANSCRIPT
Uniwersytet Łódzki
Wydział Matematyki i Informatyki,
Katedra Analizy Nieliniowej
Procesowanie
dokumentów XML
Programowanie w Javie 2
mgr inż. Michał Misiak
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
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
Dokument XML
XML API
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Poprawność dokumentu
Poprawność składniowa (well-formed): 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
Poprawność strukturalna (valid) 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)
Nieoficjalny 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
Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008
Model programistyczny dla DOM
Dokument XML Parser DOM
zapisywanie
czytanie
Kontakty
Kontakt 1 Kontakt 2
Imię Nawisko Adres
Aplikacja
Nawigacja
&
Edycja
Tworzenie
drzewa
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
Dokument XMLParser DOM
czytanie
Aplikacja
startWystąpienie
zdarzeń
handler
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.parsers.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: Obiektowość DOM
Szybkość i prostota SAX
SAXDOMIX pozwala rozwiązywać np. problem zliczenia (SAX) i posortowania (DOM) danych 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)
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"));
}
}
Przykład: