Przetwarzanie XML Autor wykładu: Maciej Zakrzewicz Przetwarzanie XML
Plan wykładu Modelowanie dokumentów XML za pomocą drzew DOM Specyfikacja W3C DOM API Implementacja drzew DOM w języku Java Nawigacja wewnątrz drzew DOM w języku Java Język zapytań XPath 1.0 Parsery DOM Przetwarzanie XML (2)
Document Object Model (DOM) Standard modelowania dokumentów XML przy użyciu struktury drzewa Forma reprezentacji dokumentów XML w pamięci komputera Parser DOM Biblioteka DOM API Język zapytań XPath Przetwarzanie XML (3)
Przykładowy dokument XML <katalog> <ksiazka isbn="83-7243-134-5"> <tytul>xml krok po kroku</tytul> <cena>43</cena> <autorzy> <autor>michael J. Young</autor> <autor>katarzyna Tryc</autor> </autorzy> <wydawnictwo>read Me</wydawnictwo> <rok>2000</rok> </ksiazka> </katalog> Przetwarzanie XML (4)
Przetwarzanie XML (5) Przykład struktury drzewa DOM korzeń węzeł elementu węzeł tekstowy węzeł atrybutu <ksiazka> <katalog> isbn="83-7243-134-5" <tytul> <cena> <autorzy> <wydawnictwo> <rok> XML krok po kroku 43 <autor> <autor> Michael J. Young Katarzyna Tryc Read Me 2000
Implementacja drzew DOM W3C DOM API Node NodeList Document Element Attr Text Przetwarzanie XML (6)
W3C DOM API: Typ Node (1) Typ Node reprezentuje węzeł w drzewie DOM (węzeł elementu, węzeł tekstowy, itd.) Właściwości attributes childnodes firstchild lastchild nextsibling nodename nodetype nodevalue parentnode previoussibling lista atrybutów węzła lista węzłów potomnych pierwszy węzeł potomny ostatni węzeł potomny prawy węzeł sąsiedni nazwa węzła identyfikator typu węzła wartość węzła węzeł nadrzędny lewy węzeł sąsiedni Przetwarzanie XML (7)
Przetwarzanie XML (8) W3C DOM API: Typ Node (2) Typ Node reprezentuje węzeł w drzewie DOM (węzeł elementu, węzeł tekstowy, itd.) Operacje appendchild(n) clonenode(b) haschildnodes() insertbefore(n,n) removechild(n) replacechild(n,n) dołącza nowy węzeł jako ostatni węzeł potomny zwraca kopię węzła z/bez węzłami potomnymi zwraca prawdę, jeżeli węzeł zawiera węzły potomne dołącza nowy węzeł jako węzeł potomny przed wskazanym węzłem usuwa wskazany węzeł potomny zamienia istniejący węzeł potomny z podanym węzłem
Przetwarzanie XML (9) W3C DOM API: Typ NodeList Typ NodeList reprezentuje listę obiektów typu Node Właściwości length liczba elementów na liście Operacje item(i) zwraca i-ty element listy
Przetwarzanie XML (10) W3C DOM API: Typ Document Typ Document modeluje całe drzewo DOM; wszystkie węzły drzewa są jego potomkami Właściwości documentelement doctype element najwyższego poziomu w dokumencie DTD lub XML Schema dla dokumentu Operacje createattribute(s) createcomment(s) createelement(s) createtextnode(s) getelementsbytagname(s) tworzy nowy węzeł atrybutu tworzy nowy węzeł komentarza tworzy nowy element tworzy nowy węzeł tekstowy zwraca listę węzłów o podanej nazwie
Przetwarzanie XML (11) W3C DOM API: Typ Element Typ Element modeluje węzeł reprezentujący parę znaczników XML Właściwości tagname Operacje getattribute(s) getattributenode(s) getelementsbytagname(s) removeattribute(s) removeattributenode(n) setattribute(s,s) setattributenode(n) nazwa węzła zwraca wartość podanego atrybutu zwraca węzeł podanego atrybutu zwraca zbiór węzłów o podanej nazwie usuwa wartość podanego atrybutu usuwa podany węzeł atrybutu ustawia nową wartość atrybutu wstawia nowy węzeł atrybutu
Implementacja W3C DOM: Java Typy DOM zaimplementowano jako interfejsy w pakiecie org.w3c.dom Klasy rzeczywiste W3C DOM API zaimplementowano w Java API for XML Processing (m.in. javax.xml, javax.xml.parsers, javax.xml.transform, javax.xml.xpath) Przetwarzanie XML (12)
Konstrukcja drzewa DOM w języku Java DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newdocumentbuilder(); Document xmldoc = db.newdocument(); Node katalognode = xmldoc.createelement("katalog"); xmldoc.appendchild(katalognode); Node ksiazkanode = xmldoc.createelement("ksiazka"); katalognode.appendchild(ksiazkanode); Node tytulnode = xmldoc.createelement("tytul"); ksiazkanode.appendchild(tytulnode); Node cenanode = xmldoc.createelement("cena"); ksiazkanode.appendchild(cenanode); Node tytultext = xmldoc.createtextnode("zaawansowany XML"); tytulnode.appendchild(tytultext); Node cenatext = xmldoc.createtextnode("85"); cenanode.appendchild(cenatext); <tytul> Zaawansowany XML <katalog> <ksiazka> <cena> 85 Przetwarzanie XML (13)
Przetwarzanie XML (14) DOM API: Funkcje nawigacyjne 1 ELEMENT_NODE 2 ATTRIBUTE_NODE 3 TEXT_NODE 9 DOCUMENT_NODE getnodetype() #document 9 getdocumentelement() katalog 1 getnodename() książka 1 getchildnodes() getattributes() getchildnodes() isbn 2 tytul 1 autorzy 1 rokwydania 1 wydawnictwo 1 cena 1 14-2887- getchildnodes() #text 3 autor 1 #text 3 #text 3 #text 3 C++ XML 2002 Mikom 36 getnodevalue() #text 3 Fabio Arc
Przetwarzanie XML (15) Java: nawigacja w drzewie DOM getchildnodes() 1 Document xmldoc; Node docnode = null, booknode = null, elementnode = null; NodeList docnodelist = null, booknodelist = null; docnode = xmldoc.getdocumentelement(); 3 5 docnodelist = docnode.getchildnodes(); for (int i=0; i<docnodelist.getlength(); i++) { booknode = docnodelist.item(i); booknodelist = booknode.getchildnodes(); for (int j=0; j<booknodelist.getlength(); j++) { elementnode = booknodelist.item(j); if (elementnode.getnodename().equals("tytul")) Access 2002. Projektowanie baz danych. Księga eksperta Access 2002/XP PL dla każdego ASP.NET. Vademecum profesjonalisty C++ XML Dane w sieci WWW Delphi 6. Praktyka programowania - tom 1,2 Delphi. Almanach System.out.println(elementNode.getFirstChild().getNodeValue());}} 2 4 6
Przetwarzanie XML (16) Java: nawigacja w drzewie DOM getattributes() 1 3 4 Document xmldoc; Node docnode = null, booknode = null, isbnnode = null; NodeList docnodelist = null, booknodelist = null; docnode = xmldoc.getdocumentelement(); docnodelist = docnode.getchildnodes(); for (int i=0; i<docnodelist.getlength(); i++) { } booknode = docnodelist.item(i); isbnnode = booknode.getattributes().item(0); System.out.println(isbnNode.getNodeValue()); 2 83-7197-669-0 83-7197-786-7 83-7197-691-7 83-7279-215-1 83-7279-149-X 83-7279-214-3 83-7197-469-8 83-7197-377-2
Przetwarzanie XML (17) Java: nawigacja w drzewie DOM getelementsbytagname() 1 2 Document xmldoc; Node titlenode = null; NodeList titlenodelist = null; Access 2002. Projektowanie baz danych. Access 2002/XP PL dla każdego ASP.NET. Vademecum profesjonalisty C++ XML Dane w sieci WWW Delphi 6. Praktyka programowania - tom 1,2 Delphi. Almanach titlenodelist = xmldoc.getelementsbytagname("tytul"); for (int i=0; i<titlenodelist.getlength(); i++) { titlenode = titlenodelist.item(i); System.out.println(titleNode.getFirstChild().getNodeValue()); } 3
Przetwarzanie XML (18) Java: konwersja drzewa DOM do pliku XML TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newtransformer(); t.transform(new DOMSource(xmlDoc), new StreamResult(new FileOutputStream("C:\\katalog.xml"))); javax.xml.transform javax.xml.transform.dom javax.xml.transform.stream <?xml version = '1.0' encoding = 'WINDOWS-1250'?> <katalog> <ksiazka isbn="83-7197-669-0"> <tytul>c++ XML</tytul> <autorzy> <autor>fabio Arciniegas</autor> </autorzy> <rokwydania>2002</rokwydania> <wydawnictwo>mikom</wydawnictwo> <cena>36</cena> </ksiazka> <ksiazka isbn="83-7197-669-0">
Język XPath 1.0 Specyfikacja języka do adresowania, odczytywania i przeszukiwania drzew DOM Odgrywa podobną rolę w stosunku do drzew DOM, jak język SQL w stosunku do relacyjnych baz danych Notacja przypominająca ścieżki dostępu w systemach plików Wynik zapytania: lista węzłów spełniających warunki selekcji Przetwarzanie XML (19)
Przetwarzanie XML (20) Wyrażenia ścieżkowe (1) Rozpoczynając od korzenia, wejdź do każdego węzła "katalog" i spośród jego węzłów podrzędnych wybierz wszystkie węzły "ksiazka" drzewo DOM: zapytanie: <katalog> <ksiazka> <ksiazka> <ksiazka> /katalog/ksiazka wynik: <ksiazka> <ksiazka> <ksiazka>
Przetwarzanie XML (21) Wyrażenia ścieżkowe (2) Wybierz wszystkie węzły "tytul" znajdujące się w dowolnym miejscu drzewa drzewo DOM: <katalog> <ksiazka> <ksiazka> <ksiazka> <tytul> <tytul> <tytul> zapytanie: //tytul wynik: <tytul> <tytul> <tytul>
Przetwarzanie XML (22) Wyrażenia ścieżkowe (3) Wybierz wszystkie węzły podrzędne w stosunku do wszystkich węzłów "ksiazka" znajdujących się w dowolnym miejscu drzewa drzewo DOM: <katalog> <ksiazka> <ksiazka> <ksiazka> <tytul> <cena> <autorzy> zapytanie: //ksiazka/* wynik: <tytul> <cena> <autorzy>
Przetwarzanie XML (23) Wybór n-tego węzła Wybierz każdy pierwszy węzeł "autor" podrzędny w stosunku do każdego węzła "autorzy", znajdującego się w dowolnym miejscu drzewa drzewo DOM: zapytanie: <autorzy> <autorzy> <autorzy> <autor> <autor> <autor> <autor> <autor> //autorzy/autor[1] wynik: <autor> <autor> <autor>
Przetwarzanie XML (24) Warunki selekcji (1) drzewo DOM Wybierz wszystkie węzły "ksiazka" znajdujące się w dowolnym miejscu drzewa, posiadające węzeł podrzędny "cena", z którym związana jest wartość "10" zapytanie: <ksiazka> <ksiazka> <ksiazka> <cena> <cena> <cena> 50 10 10 //ksiazka[cena=10] wynik: <ksiazka> <ksiazka>
Przetwarzanie XML (25) Warunki selekcji (2) drzewo DOM Wybierz wszystkie węzły isbn "ksiazka" znajdujące się w dowolnym zapytanie: miejscu drzewa, posiadające węzeł węzeł atrybutowy "isbn" o wartości "11-22-33" wynik: <ksiazka> <ksiazka> <ksiazka> isbn //ksiazka[@isbn=11-22-33] <ksiazka> isbn 11-22-33 22-33-44 33-44-55
Przetwarzanie XML (26) Ćwiczenie zapytań XPath XPath Visualizer
Funkcje XPath w DOM API selectnodes() lista węzłów pobranych przez podane zapytanie XPath selectsinglenode() pierwszy znaleziony węzeł z wyniku zapytania XPath valueof() treść pierwszego znalezionego węzła z wyniku zapytania XPath Przetwarzanie XML (27)
Przetwarzanie XML (28) Zapytania XPath: selectnodes() Document xmldoc; Node titlenode = null; NodeList querynodelist = null; querynodelist = xmldoc.selectnodes("//ksiazka[rokwydania='2002']/tytul"); for (int i=0; i<querynodelist.getlength(); i++) { } titlenode = querynodelist.item(i); C++ XML Flash i XML. Techniki zaawansowane HTML and XML dla początkujących Programowanie Microsoft SQL Server 2000 z XML Vademecum XML XML Kompendium programisty System.out.println(titleNode.getFirstChild().getNodeValue());
Przetwarzanie XML (29) Parser DOM Aplikacja DOM API Parser DOM Dokument XML Drzewo DOM
Przetwarzanie XML (30) Generowanie drzewa DOM Node titlenode = null; NodeList titlenodelist = null; C++ XML Flash i XML. Techniki zaawansowane HTML and XML dla początkujących Java i XML Nauka języka XML Po prostu XML DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newdocumentbuilder(); Document xmldoc = db.parse(new File("katalog.xml")); titlenodelist = xmldoc.getelementsbytagname("tytul"); for (int i=0; i<titlenodelist.getlength(); i++) { titlenode = titlenodelist.item(i); System.out.println(titleNode.getFirstChild().getNodeValue()); }
Java API for XML Processing (JAXP) Interfejs programistyczny umożliwiający: parsowanie dokumentów XML walidację dokumentów XML transformację dokumentów XML przeszukiwanie dokumentów XML Podstawowe elementy: Document Object Model (DOM) Simple API for XML (SAX) Streaming API for XML (StAX) Przetwarzanie XML (31)
Przetwarzanie XML (32) Simple API for XML (SAX) SAX API to interfejs programistyczny wykorzystujący model zdarzeniowy do budowy parserów dokumentów XML Parser SAX odczytuje wskazany dokument XML i dla każdego zidentyfikowanego elementu składniowego wywołuje standardowe metody callback obiektu klasy przygotowanej przez programistę klasa dziedzicząca z DocumentHandler SAX API umożliwia konwersję dokumentu XML do dowolnej struktury danych, a nie wyłącznie do drzewa DOM nie wymaga przechowania całego dokumentu w pamięci aplikacja musi pamiętać stan między wywołaniami metod callback
Przetwarzanie XML (33) SAX Przykład klasy DocumentHandler import org.xml.sax.*; public class MyHandler extends HandlerBase { public void startelement(string name, AttributeList atts) { // metoda wywoływana gdy parser SAX natrafi na znacznik otwierający } public void endelement(string name) { // metoda wywoływana gdy parser SAX natrafi na znacznik zamykający } public void characters(char ch[], int start, int length) { String value = new String(ch, start, length); // metoda wywoływana gdy parser SAX zakończy odczyt treści znacznika }}
Przetwarzanie XML (34) SAX Korzystanie z klasy DocumentHandler 1. Utwórz obiekt własnej klasy przetwarzania dokumentu XML 2. Utwórz obiekt parsera SAX (klasa SAXParser) 3. Za pomocą metody setdocumenthandler() przyłącz obiekt własnej klasy przetwarzania dokumentu XML do obiektu parsera XML 4. Wywołaj metodę parse() obiektu parsera, przekazując jej adres URL przetwarzanego dokumentu XML import org.xml.sax.*; MyHandler handler = new MyHandler(); Parser parser = new SAXParser(); parser.setdocumenthandler(handler); parser.parse("file://c:/katalog.xml");
SAX Przykład sekwencji zdarzeń <?xml version="1.0" encoding="windows-1250"?> <katalog> <ksiazka url="http://dot.com/19821.html"> <tytul> C++ XML </tytul> <autorzy> <autor> Fabio Arciniegas </autor> </autorzy> </katalog> startdocument() startelement("katalog") startelement("ksiazka","http:/") startelement("tytul") characters("c++ XML") endelement("tytul") startelement("autorzy") startelement("autor") characters("fabio Arciniegas") endelement("autor") endelement("autorzy") endelement("katalog") enddocument() Przetwarzanie XML (35)
Streaming API for XML (StAX) Parsery DOM i SAX to dwa skrajne podejścia do parsowania XML StAX stanowi próbę opracowania rozwiązania pośredniego mniejsze wymagania pamięciowe niż DOM wygodniejszy i bardziej naturalny niż SAX Cechy parsera StAX: strumieniowy odczyt kolejnych porcji dokumentu (przesuwanie kursora w przód po dokumencie) podejście PULL, a nie PUSH jak w SAX Przetwarzanie XML (36)
Przetwarzanie XML (37) StAX - Przykład import javax.xml.stream.*; URL u = new URL("http://www.test.org/"); InputStream in = u.openstream(); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader parser = factory.createxmlstreamreader(in); while (true) { int event = parser.next(); if (event == XMLStreamConstants.END_DOCUMENT) { parser.close(); break; } if (event == XMLStreamConstants.START_ELEMENT) { System.out.println(parser.getLocalName()); } } <html> <head> <title>test</title> </head> <body> <h1>welcome! </h1> html head title body h1
Podsumowanie Przetwarzanie danych XML na poziomie drzew DOM Standardowa specyfikacja W3C DOM API Niezależność od języka programowania Realizacja złożonych zapytań w języku XPath Automatyczna transformacja XML->DOM za pomocą parserów DOM Inne typy parserów: SAX, StAX Przetwarzanie XML (38)
Materiały dodatkowe "Document Object Model", http://www.w3.org/dom "Java API for XML Processing", http://java.sun.com/webservices/jaxp/ "XML Path Language", http://www.w3.org/tr/xpath "XPath Tutorial", http://www.w3schools.com/xpath/default.asp Przetwarzanie XML (39)