programowanie w javie 2 - kolos wikikolos.math.uni.lodz.pl/~archive/java 2/02 i 03 dom sax/dom sax...

31
Uniwersytet Łódzki Wydział Matematyki i Informatyki, Katedra Analizy Nieliniowej Procesowanie dokumentów XML Programowanie w Javie 2 mgr inż. Michał Misiak

Upload: letruc

Post on 28-Feb-2019

219 views

Category:

Documents


0 download

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:

Wydział Matematyki i Informatyki UŁ, Katedra Analizy Nieliniowej, M.Misiak © 2008

Dziękuje!

Zapraszam na kolejne wykłady ;)