Drzewa DOM. Maciej Zakrzewicz. mzakrz@cs.put.poznan.pl http://www.cs.put.poznan.pl/~mzakrz/



Podobne dokumenty
Wykorzystywanie parsera DOM w programach Java i PL/SQL

Wprowadzenie do XML. Tomasz Traczyk.

Zaawansowane aplikacje internetowe. Wykład 2. Komunikacja XML. wykład prowadzi: Maciej Zakrzewicz. Komunikacja XML

Model semistrukturalny

XPath XML Path Language. XPath. XSLT część 1. XPath data model. Wyrażenia XPath. Location paths. Osie (axes)

Słowem wstępu. Standard: W3C XPath razem XSLT 1.0. XPath razem z XQuery 1.0 i XSLT 2.0. XPath trwają prace nad XPath 3.

Zaawansowane aplikacje WWW - laboratorium

Wielowarstwowe aplikacje internetowe. Przetwarzanie XML. Autor wykładu: Maciej Zakrzewicz. Przetwarzanie XML

Kurs języka Python Wykład 8. Przetwarzanie tekstu Wyrażenia regularne Biblioteka urllib Parsowanie html'a XML

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

SAX i DOM wykorzystanie XML-a we własnych aplikacjach. Simple API for XML Parsing Document Object Model

XQuery. sobota, 17 grudnia 11

Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 05

XML Path Language (XPath)

Aplikacje internetowe i rozproszone

Języki XPath i XQuery

Języki XPath i XQuery

Cw.12 JAVAScript w dokumentach HTML

XML extensible Markup Language. część 5

METAJĘZYKI. Politechnika Koszalińska Wydział Elektroniki i Informatyki Katedra Inżynierii Komputerowej

XQuery. XQuery. Przykład. dokument XML. XQuery (XML Query Language) XQuery 1.0: An XML Query Language. W3C Recommendation

XML w.net. Dominik Baś nr alb Wrocław, 29 maja 2007

1 XML w bazach danych

Generowanie dokumentów XML z tabel relacyjnych - funkcje SQLX

Modelowanie hierarchicznych struktur w relacyjnych bazach danych

Prezentacja i transformacja

Extensible Markup Language (XML) Wrocław, Java - technologie zaawansowane

JAVAScript w dokumentach HTML (1) JavaScript jest to interpretowany, zorientowany obiektowo, skryptowy język programowania.

PL/SQL. Część 1 Bloki PL/SQL. Piotr Medoń

Języki XPath i XQuery

Plan prezentacji. Krótko o XML Arkusze stylów XSLT XSL XSL Path Przegląd konstrukcji języka i przykłady Narzędzia Podsumowanie Literatura

Zaawansowany kurs języka Python

Elektroniczna wymiana danych (EDI) jest to: - wymiana informacji pomiędzy komputerami, z użyciem powszechnie akceptowanych standardów

Przetwarzanie dokumentów XML i zaawansowane techniki WWW Wykład 03

Modele dostępu do dokumentu XML. Implementacja modelu parser. SAX2 pakiet org.xml.sax. Działanie modelu SAX przykład

Obiektowy model dokumentu. Katedra Mikroelektroniki i Technik Informatycznych

Perl a XML. Narzędzia informatyczne w językoznawstwie. Generowanie danych XML - Przykład. Generowanie danych XML. Perl - Przetwarzanie XML

TOPIT Załącznik nr 3 Programowanie aplikacji internetowych

Podstawy języka XML. UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

Procesowanie dokumentów XML

WYKŁAD 3 XML DOM XML DOCUMENT OBJECT MODEL CZĘŚĆ 1

XPath XML Path Language. XPath. XSLT część 1. XPath data model. Wyrażenia XPath. Osie (axes) Location paths

Programowanie obiektowe

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

Właściwości i metody obiektu Comment Właściwości

Podstawy programowania skrót z wykładów:

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

w PL/SQL bloki nazwane to: funkcje, procedury, pakiety, wyzwalacze

Wstęp do programowania. Różne różności

JĘZYKI WYSZUKIWANIA W DOKUMENTACH XML

JAVAScript w dokumentach HTML (1)

Programowanie Obiektowe GUI

SAX2 pakiet org.xml.sax

Kurs WWW Język XML, część II

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Definicja pliku kratowego

Podstawy XML-a. Zaawansowane techniki programowania

SQL, LIKE, IN, CASE, EXISTS. Marcin Orchel

Zakres tematyczny dotyczący kursu PHP i MySQL - Podstawy pracy z dynamicznymi stronami internetowymi

XML we własnych aplikacjach

PL/SQL. Zaawansowane tematy PL/SQL

UEK w Krakowie Janusz Stal & Grażyna Paliwoda-Pękosz

ZMODYFIKOWANY Szczegółowy opis przedmiotu zamówienia

Kurs rozszerzony języka Python

PODSTAWY BAZ DANYCH 13. PL/SQL

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Bloki anonimowe w PL/SQL

Wprowadzenie do języka Java

XPath i XQuery. Patryk Czarnik. XML i nowoczesne technologie zarządzania treścią 2011/12. Wprowadzenie Status Model danych XPath

Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

4 Web Forms i ASP.NET Web Forms Programowanie Web Forms Możliwości Web Forms Przetwarzanie Web Forms...152

Zasady programowania Dokumentacja

Języki skryptowe w programie Plans

Prezentacja i transformacja

Powtórka algorytmów. Wprowadzenie do języka Java.

JAVAScript w dokumentach HTML - przypomnienie

Przestrzenne bazy danych Podstawy języka SQL

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Informatyka (10) dr inż. Katarzyna Palikowska Katedra Transportu Szynowego i Mostów p. 4 Hydro

Pakiety podprogramów Dynamiczny SQL

Metody dostępu do danych

Język SQL. Rozdział 2. Proste zapytania

Programowanie obiektowe

JavaScript funkcyjność

ORACLE (Wykład 1) aragorn.pb.bialystok.pl/~aonisko. Typy rozproszonych baz danych. Systemy klient-serwer. Klient-serwer: Przykład

Podstawowe kontrolki graficzne. Obsługa plików poprzez kontrolki

Rys.2.1. Trzy warstwy stanowiące podstawę popularnego podejścia w zakresie budowy stron internetowych [2]

Instrukcja 5 Laboratorium z Podstaw Inżynierii Oprogramowania. Warstwy integracji z bazą danych: Wzorzec DAO Technologia ORM

Struktury danych: stos, kolejka, lista, drzewo

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Ajax. Æwiczenia IDZ DO KATALOG KSI EK TWÓJ KOSZYK CENNIK I INFORMACJE CZYTELNIA PRZYK ADOWY ROZDZIA. SPIS TREœCI KATALOG ONLINE

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Procedury wyzwalane. (c) Instytut Informatyki Politechniki Poznańskiej 1

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

Transkrypt:

Drzewa DOM Maciej Zakrzewicz mzakrz@cs.put.poznan.pl http://www.cs.put.poznan.pl/~mzakrz/

Document Object Model (DOM) Document Object Model jest standardem modelowania dokumentów XML przy użyciu struktury drzewa znaczniki XML i ich zawartość są modelowane przez węzły drzewa; zagnieżdżanie znaczników służy za podstawę do konstruowania hierarchii Document Object Model jest wykorzystywany jako forma reprezentacji dokumentów XML w pamięci komputera Transformacja dokumentu XML do postaci Document Object Model jest realizowana automatycznie przez parser DOM Implementacja, adresowanie i przeszukiwanie drzew Document Object Model mogą być realizowane przy użyciu biblioteki DOM API

Przykład struktury drzewa DOM <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> <ksiazka> <katalog> isbn="83-7243-134-5" <tytul> <cena> <autorzy> <wydawnictwo> <rok> korzeń węzeł elementu XML krok po kroku 43 <autor> <autor> Read Me 2000 węzeł tekstowy węzeł atrybutu Michael J. Young Katarzyna Tryc

W3C DOM API: obiekt Node Obiekt klasy/typu Node reprezentuje węzeł w drzewie DOM (węzeł elementu, węzeł tekstowy, itd.) Atrybuty (W3C) attributes tablica atrybutów węzła childnodes tablica węzłów potomnych firstchild pierwszy węzeł potomny lastchild ostatni węzeł potomny nextsibling prawy węzeł sąsiedni nodename nazwa węzła nodetype identyfikator typu węzła nodevalue wartość węzła parentnode węzeł nadrzędny Metody (W3C) 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 previoussibling lewy węzeł sąsiedni

W3C DOM API: obiekt NodeList Obiekt klasy/typu NodeList reprezentuje zbiór obiektów typu Node Atrybuty (W3C) length liczba elementów w zbiorze Metody (W3C) item(i) zwraca element i-ty element zbioru

W3C DOM API: obiekt Document Obiekt klasy/typu Document modeluje całe drzewo DOM; wszystkie węzły drzewa są jego potomkami Atrybuty (W3C) Metody (W3C) documentelement doctype element najwyższego poziomu w dokumencie DTD lub XML Schema dla dokumentu 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 zbiór węzłów o podanej nazwie

W3C DOM API: obiekt Element Obiekt klasy/typu Element modeluje węzeł reprezentujący znacznik XML Atrybuty (W3C) tagname nazwa węzła Metody (W3C) getattribute(s) getattributenode(s) getelementsbytagname(s) removeattribute(s) removeattributenode(n) setattribute(s,s) setattributenode(n) 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

W3C DOM API: obiekt Attr i Text Obiekt klasy/typu Attr reprezentuje atrybut znacznika XML w formie tzw. węzła atrybutu; obiekt Attr posiada ogólne atrybuty i metody klasy/typu Node plus poniższe: Atrybuty (W3C) name specified value nazwa atrybutu prawda oznacza, że wartość atrybutu jest ustawiona w dokumencie wartość atrybutu Obiekt klasy/typu Text reprezentuje treść umieszczoną wewnątrz znacznika XML

Implementacja W3C DOM: Java i PL/SQL Wszystkie typy DOM zostały zaimplementowane w języku Java jako interfejsy w pakiecie org.w3c.dom (posiadają nazwy jak w specyfikacji W3C) i jako klasy rzeczywiste w pakiecie oracle.xml.parser.v2 (posiadają nazwy z prefiksem XML) Wszystkie typy DOM zostały zaimplementowane w języku PL/SQL jako obiekty pakietu XMLDOM (posiadają nazwy z prefiksem DOM) i DBMS_XMLDOM (od wersji 9.2 DBMS_XMLDOM zaczyna zastępować XMLDOM)

Java: funkcje konstrukcji drzew DOM createelement(string) [interfejs Document] tworzy nowy węzeł, reprezentujący znacznik o podanej nazwie; węzeł ten nie wchodzi jeszcze w skład drzewa dokumentu createtextnode(string) [interfejs Document] tworzy nowy węzeł tekstowy; węzeł ten nie wchodzi jeszcze w skład drzewa dokumentu appendchild(node) [interfejs Node] dodaje nowy węzeł jako ostatni węzeł potomny clonenode(boolean) [interfejs Node] wykonuje kopię wskazanego węzła wraz z lub bez jego węzłów potomnych removechild(node) [interfejs Node] odpina wskazany węzeł potomny od jego węzła nadrzędnego replacechild(node, Node) [interfejs Node] odpina istniejący węzeł potomny i na jego miejscu umieszcza nowy węzeł potomny setnodevalue(string) [interfejs Node] nadaje węzłowi wartość tekstową

Konstrukcja drzewa DOM w języku Java XMLDocument xmldoc = new XMLDocument(); Node katalognode = xmldoc.createelement("katalog"); xmldoc.appendchild(katalognode); Node ksiazkanode = xmldoc.createelement("ksiazka"); katalognode.appendchild(ksiazkanode); Node tytulnode = xmldoc.createelement("tytul"); ksiazkanode.appendchild(tytulnode); <katalog> <ksiazka> Node tytultext = xmldoc.createtextnode("zaawansowany XML"); tytulnode.appendchild(tytultext); <tytul> <cena> Node cenatext = xmldoc.createtextnode("85"); tytulnode.appendchild(tytultext); Zaawansowany XML 85

PL/SQL: funkcje konstrukcji drzew DOM xmldom.createelement(domdocument, Varchar2) tworzy nowy węzeł, reprezentujący znacznik o podanej nazwie; węzeł ten nie wchodzi jeszcze w skład drzewa dokumentu xmldom.createtextnode(domdocument, Varchar2) tworzy nowy węzeł tekstowy; węzeł ten nie wchodzi jeszcze w skład drzewa dokumentu xmldom.appendchild(domdocument, DOMNode) dodaje nowy węzeł jako ostatni węzeł potomny xmldom.clonenode(domdocument, boolean) wykonuje kopię wskazanego węzła wraz z lub bez jego węzłów potomnych xmldom.removechild(domdocument, DOMNode) odpina wskazany węzeł potomny od jego węzła nadrzędnego xmldom.replacechild(domdocument, DOMNode, DOMNode) odpina istniejący węzeł potomny i na jego miejscu umieszcza nowy węzeł potomny xmldom.setnodevalue(domdocument, Varchar2) nadaje węzłowi wartość tekstową xmldom.makenode(domelement) konwertuje typ DOMElement do DOMNode

Konstrukcja drzewa DOM w języku PL/SQL declare xmldoc xmldom.domdocument; tmpnode xmldom.domnode; katalogelement xmldom.domelement; ksiazkaelement xmldom.domelement; tytulelement xmldom.domelement; cenaelement xmldom.domelement; cenatext xmldom.domtext; tytultext xmldom.domtext; tytulnode xmldom.domnode; cenanode xmldom.domnode; begin xmldoc := xmldom.newdomdocument; katalogelement := xmldom.createelement(xmldoc, 'katalog'); tmpnode := xmldom.appendchild(xmldom.makenode(xmldoc), xmldom.makenode(katalogelement)); ksiazkaelement := xmldom.createelement(xmldoc, 'ksiazka'); tmpnode := xmldom.appendchild(tmpnode, xmldom.makenode(ksiazkaelement)); <katalog> tytulelement := xmldom.createelement(xmldoc, 'tytul'); tytulnode := xmldom.appendchild(tmpnode, xmldom.makenode(tytulelement)); <ksiazka> cenaelement := xmldom.createelement(xmldoc, 'cena'); cenanode := xmldom.appendchild(tmpnode, xmldom.makenode(cenaelement)); tytultext := xmldom.createtextnode(xmldoc, 'Zaawansowany XML'); <tytul> <cena> tmpnode := xmldom.appendchild(tytulnode, xmldom.makenode(tytultext)); cenatext := xmldom.createtextnode(xmldoc, '85'); Zaawansowany tmpnode := xmldom.appendchild(cenanode, xmldom.makenode(cenatext)); XML 85 end;

Java: funkcje nawigacyjne DOM API getdocumentelement() [interfejs Document] zwraca obiekt węzła reprezentującego znacznik najwyższego poziomu getelementsbytagname(string) [interfejs Document] zwraca tablicę obiektów węzłów reprezentujących podany znacznik XML getchildnodes() [interfejs Node] zwraca tablicę obiektów węzłów potomnych (bez węzłow atrybutowych) getattributes() [interfejs Node] zwraca tablicę obiektów potomnych węzłów atrybutowych getnodename() [interfejs Node] zwraca nazwę znacznika dla węzła getnodetype() [interfejs Node] zwraca numeryczny identyfikator typu węzła getnodevalue() [interfejs Node] zwraca treść węzła (tylko dla węzłów tekstowych) getfirstchild() [interfejs Node] - zwraca obiekt pierwszego węzła potomnego (z pominięciem węzłów atrybutowych) getlastchild() [interfejs Node] - zwraca obiekt ostatniego węzła potomnego (z pominięciem węzłów atrybutowych) getnextsibling() [interfejs Node] zwraca obiekt prawego sąsiada węzła (z pominięciem węzłów atrybutowych) getprevioussibling() [interfejs Node] zwraca obiekt lewego sąsiada węzła (z pominięciem węzłów atrybutowych) getparentnode() [interfejs Node] zwraca obiekt węzła nadrzędnego

PL/SQL: funkcje nawigacyjne DOM API xmldom.getdocumentelement(domdocument) zwraca obiekt węzła reprezentującego znacznik najwyższego poziomu xmldom.getelementsbytagname(domdocument) zwraca tablicę obiektów węzłów reprezentujących podany znacznik XML xmldom.getchildnodes(domnode) zwraca tablicę obiektów węzłów potomnych (bez węzłow atrybutowych) xmldom.getattributes(domnode) zwraca tablicę obiektów potomnych węzłów atrybutowych xmldom.getnodename(domnode) zwraca nazwę znacznika dla węzła xmldom.getnodetype(domnode) zwraca numeryczny identyfikator typu węzła xmldom.getnodevalue(domnode) zwraca treść węzła (tylko dla węzłów tekstowych) xmldom.getfirstchild(domnode) - zwraca obiekt pierwszego węzła potomnego (z pominięciem węzłów atrybutowych) xmldom.getlastchild(domnode) - zwraca obiekt ostatniego węzła potomnego (z pominięciem węzłów atrybutowych) xmldom.getnextsibling(domnode) zwraca obiekt prawego sąsiada węzła (z pominięciem węzłów atrybutowych) xmldom.getprevioussibling(domnode) zwraca obiekt lewego sąsiada węzła (z pominięciem węzłów atrybutowych) xmldom.getparentnode(domnode) zwraca obiekt węzła nadrzędnego

DOM API: funkcje nawigacyjne #document D katalog getdocumentelement() E getnodename() książka E getchildnodes() getattributes() getchildnodes() isbn 14-2887- A tytul E autorzy E rokwydania E #text T autor E #text T C++ XML 2002 #text T Fabio Arc getnodevalue() getchildnodes() wydawnictwo E #text Mikom T cena E #text T 36 D DOCUMENT_NODE (9) E ELEMENT_NODE (1) A ATTRIBUTE_NODE (2) T TEXT_NODE (3)

Java: prosta nawigacja w drzewie DOM XMLDocument d e=d.getdocumentelement() c=e.getchildnodes() f=c.item(i) f.getnodename(), f.getnodevalue(), f.getnodetype() Odczytaj węzeł reprezentujący znacznik najwyższego poziomu (np. <katalog>) Pobierz listę elementów potomnych W pętli odczytuj kolejne węzły z listy (np. <ksiazka>) Przetwarzaj węzeł g=f.getchildnodes() Pobierz listę elementów potomnych h=g.item(j) Odczytaj kolejny węzeł z listy (np. <tytul>,<autorzy>,<cena>,<rok>, <wydawnictwo>)

Java: nawigacja w drzewie DOM getchildnodes() Wyświetl tytuły wszystkich książek opisanych w dokumencie XML XMLDocument xmldoc; Node docnode = null, booknode = null, elementnode = null; NodeList docnodelist = null, booknodelist = null; try { docnode = xmldoc.getdocumentelement(); 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")) System.out.println(elementNode.getFirstChild().getNodeValue()); }}} catch (Exception e) {System.out.println(e);} 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

Java: nawigacja w drzewie DOM getattributes() Wyświetl wartość pierwszego atrybutu każdego znacznika <ksiazka> w dokumencie XML XMLDocument xmldoc; Node docnode = null, booknode = null, urlnode = null; NodeList docnodelist = null, booknodelist = null; try { docnode = xmldoc.getdocumentelement(); docnodelist = docnode.getchildnodes(); for (int i=0; i<docnodelist.getlength(); i++) { booknode = docnodelist.item(i); urlnode = booknode.getattributes().item(0); System.out.println(urlNode.getNodeValue()); } } catch (Exception e) {System.out.println(e);} 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

Java: nawigacja w drzewie DOM getelementsbytagname() Wyświetl tytuły wszystkich książek opisanych w dokumencie XML Access 2002. Projektowanie baz danych. Księga eksperta Access 2002/XP PL dla każdego ASP.NET. Vademecum profesjonalisty XMLDocument xmldoc; C++ XML Dane w sieci WWW Node titlenode = null; Delphi. Almanach NodeList titlenodelist = null; try { titlenodelist = xmldoc.getelementsbytagname("tytul"); for (int i=0; i<titlenodelist.getlength(); i++) { titlenode = titlenodelist.item(i); System.out.println(titleNode.getFirstChild().getNodeValue()); } } catch (Exception e) {System.out.println(e);} Delphi 6. Praktyka programowania - tom 1,2

PL/SQL: prosta nawigacja w drzewie DOM DOMDocument d e=getdocumentelement(d) c=getchildnodes(makenode(e)) f=item(c,i) getnodename(f), getnodevalue(f), getnodetype(f) Odczytaj węzeł reprezentujący znacznik najwyższego poziomu (np. <katalog>) Pobierz listę elementów potomnych W pętli odczytuj kolejne węzły z listy (np. <ksiazka>) Przetwarzaj węzeł g=getchildnodes(f) Pobierz listę elementów potomnych h=item(g,j) Odczytaj kolejny węzeł z listy (np. <tytul>,<autorzy>,<cena>,<rok>, <wydawnictwo>)

PL/SQL: nawigacja w drzewie DOM getchildnodes() Wyświetl tytuły wszystkich książek opisanych w dokumencie XML declare xmldoc xmldom.domdocument; xmlelem xmldom.domelement; booknode xmldom.domnode; booknodelist xmldom.domnodelist; innernode xmldom.domnode; innernodelist xmldom.domnodelist; begin Access 2002. Projektowanie baz danych. Księga eksperta xmlelem := xmldom.getdocumentelement(xmldoc); Access 2002/XP PL dla każdego booknodelist := xmldom.getchildnodes(xmldom.makenode(xmlelem)); ASP.NET. Vademecum profesjonalisty C++ XML for i in 0..xmldom.getLength(bookNodeList) - 1 loop Dane w sieci WWW booknode := xmldom.item(booknodelist, i); Delphi 6. Praktyka programowania - tom innernodelist := xmldom.getchildnodes(booknode); 1,2 Delphi. Almanach for j in 0..xmldom.getLength(innerNodeList) - 1 loop innernode := xmldom.item(innernodelist, j); if (xmldom.getnodename(innernode) = 'tytul') then dbms_output.put_line(xmldom.getnodevalue(xmldom.getfirstchild(innernode))); end if; end loop; end loop; xmldom.freedocument(xmldoc); end;

PL/SQL: nawigacja w drzewie DOM getattributes() Wyświetl wartość pierwszego atrybutu każdego znacznika <ksiazka> w dokumencie XML declare xmldoc xmldom.domdocument; xmlelem xmldom.domelement; booknode xmldom.domnode; booknodelist xmldom.domnodelist; attrnode xmldom.domnode; begin xmlelem := xmldom.getdocumentelement(xmldoc); booknodelist := xmldom.getchildnodes(xmldom.makenode(xmlelem)); for i in 0..xmldom.getLength(bookNodeList) - 1 loop booknode := xmldom.item(booknodelist, i); attrnode := xmldom.item(xmldom.getattributes(booknode),0); dbms_output.put_line(xmldom.getnodevalue(attrnode)); end loop; xmldom.freedocument(xmldoc); end; 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

declare PL/SQL: nawigacja w drzewie DOM getelementsbytagname() Wyświetl tytuły wszystkich książek opisanych w dokumencie XML xmldoc xmldom.domdocument; titlenode xmldom.domnode; titlenodelist xmldom.domnodelist; begin titlenodelist := xmldom.getelementsbytagname(xmldoc,'tytul'); for i in 0..xmldom.getLength(titleNodeList) - 1 loop titlenode := xmldom.item(titlenodelist, i); dbms_output.put_line(xmldom.getnodevalue(xmldom.getfirstchild(titlenode))); end loop; xmldom.freedocument(xmldoc); end; 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

Java: konwersja drzewa DOM do pliku XML try { xmldoc.print(new FileOutputStream("C:\\katalog.xml")); } catch (Exception e) {System.out.println(e);} <?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> <rokwydania>2002</rokwydania> <wydawnictwo>mikom</wydawnictwo> <cena>36</cena> </ksiazka> <ksiazka url="http://dot.com/19854.html">

PL/SQL: konwersja drzewa DOM do pliku XML xmldom.writetofile(xmldoc,/mydir/a.xml'); <?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> <rokwydania>2002</rokwydania> <wydawnictwo>mikom</wydawnictwo> <cena>36</cena> </ksiazka> <ksiazka url="http://dot.com/19854.html">

Język XPath Maciej Zakrzewicz mzakrz@cs.put.poznan.pl http://www.cs.put.poznan.pl/~mzakrz/

Język XPath XPath to specyfikacja języka służącego do adresowania, odczytywania i przeszukiwania drzew DOM dokumentów XML XPath odgrywa podobną rolę w stosunku do drzew DOM, jak język SQL w stosunku do relacyjnych baz danych XPath stosuje notację przypominającą ścieżki dostępu w systemach plików Wynikiem ewaluacji wyrażenia XPath jest zbiór węzłów spełniających warunki selekcji XPath pozwala stosować dwa rodzaje zapisu wyrażeń: skrócony i pełny; rodzaje te mogą być mieszane

Przetwarzanie wyrażeń XPath Wyrażenie XPath

Skrócone wyrażenia XPath (1/3) Wybór węzłów w drzewie DOM: wybierz autorów wszystkich książek /katalog/ksiazka/autorzy wybierz wszystkie wydawnictwa dowolnie zagłębione w drzewie //wydawnictwo wybierz wszystkie węzły potomne (dzieci) każdego węzła książka //ksiazka/* Wybór n-tego węzła danego rodzaju: wybierz pierwszego autora każdej książki //autorzy/autor[1] wybierz drugiego autora pierwszej książki //ksiazka[1]//autor[2] wybierz ostatnią książke //ksiazka[last()]

Skrócone wyrażenia XPath (2/3) Wybór węzłów, które posiadają podany węzeł potomny: wybierz książki, które posiadają autorów //ksiazka[autorzy] wybierz książki, które napisał Serge Abiteboul //ksiazka[autorzy/autor="serge Abiteboul"] Alternatywa ścieżek: wybierz tytuły książek i wydawnictwa //tytul //wydawnictwo wybierz tytuły książek napisanych przez Serge'a Abiteboula lub Kurta Walla //tytul[..//autor="serge Abiteboul"] //tytul[..//autor="kurt Wall"]

Skrócone wyrażenia XPath (3/3) Wybór węzłów zawierających atrybuty: wybierz książkę o numerze ISBN "83-7279-149-X" //ksiazka[@isbn="83-7279-149-x"] wybierz wszystkie numery ISBN //@isbn wybierz książki, które posiadają numer ISBN //ksiazka[@isbn] Odczyt treści węzła: odczytaj treści wszystkich tytułów książek //ksiazka/tytul/text()

Pełne wyrażenia XPath Wyrażenie ścieżkowe XPath składa się z tzw. kroków rozdzielonych ukośnikami W pełnym zapisie, każdy z kroków może składać się z: specyfikatora współrzędnych (axis), służącego do określenia miejsca w drzewie, począwszy od którego wyszukiwane będą węzły testu węzła (node test), służącego do określenia, które węzły są wyszukiwane w obszarze drzewa określonym przez specyfikator współrzędnych predykatów, dodatkowo zawężających test węzła, powodujących wybór tylko tych węzłów, które spełniają podany warunek Każdy krok pełnego wyrażenia XPath zapisywany jest przy użyciu następującej notacji: spec_współrzędnych::test_węzła[predykaty]

Specyfikatory współrzędnych ancestor ancestor-or-self attribute child descendant descendant-or-self following following-sibling parent preceding preceding-sibling self obejmuje wszystkie węzły nadrzędne (ojciec, dziadek, itd.) bieżącego węzła obejmuje bieżący węzeł plus wszystkie węzły nadrzędne obejmuje wszystkie atrybuty bieżącego węzła obejmuje wszystkie węzły bezpośrednio podrzędne bieżącego węzła (dzieci) obejmuje wszystkie węzły podrzędne (syn, wnuk, itd.) bieżącego węzła obejmuje bieżący węzeł plus wszystkie węzły podrzędne obejmuje wszystkie węzły, które w dokumencie następują za węzłem bieżącym obejmuje wszystkie węzły sąsiednie, które w dokumencie następują za węzłem bieżącym obejmuje węzeł bezpośrednio nadrzędny bieżącego węzła (ojciec) obejmuje wszystkie węzły, które w dokumencie następują przed węzłem bieżącym obejmuje wszystkie węzły sąsiednie, które w dokumencie następują przed węzłem bieżącym obejmuje bieżący węzeł

Testy węzłów, operatory i funkcje node() text() * @* nazwa dowolny węzeł węzeł tekstowy dowolny element dowolny atrybut węzeł o podanej nazwie =,!=, <, >, <=, >= or, and +, -, *, div, mod count() last() name() position() not() true() false() porównania operatory logiczne operatory arytmetyczne liczba węzłów wybieranych przez wyrażenie liczba porządkowa ostatniego węzła wybieranego przez wyrażenie nazwa węzła wybieranego przez wyrażenie liczba porządkowa węzła wybieranego przez wyrażenie negacja logiczna zwraca prawdę logiczną zwraca fałsz logiczny

Funkcje operujące na tekstach concat() konkatenacja tekstów Funkcje - ciąg dalszy contains() starts-with() string() string-length() substring() substring-after() substring-before() translate() test zawierania tekstów sprawdzenie, czy tekst rozpoczyna się od podanego ciągu konwersja do tekstu długość tekstu ekstrakcja podciągu znaków zwraca ciąg znaków znajdujący się za wycinanym podciągiem zwraca ciąg znaków znajdujący się przed wycinanym podciągiem dokonuje zamiany wszystkich wystąpień podanego podciągu Funkcje operujące na liczbach ceiling() floor() number() round() sum() górne domknięcie całkowite dolne domknięcie całkowite konwersja do liczby zaokrąglenie suma zbioru wartości liczbowych

Przykłady wyrażeń XPath (1/2) Wybierz książki, których cena nie przekracza 20 zł //ksiazka[cena<=20] Wybierz tytuły książek o cenach w przedziale 30-40 zł //ksiazka/tytul[../cena>30 and../cena<40] Wybierz książki napisane przez więcej niż dwóch autorów //ksiazka[count(autorzy/autor)>2] Wybierz co drugą książkę //ksiazka[position() mod 2 = 1] Wybierz książki zawierające w tytule słowo XML //ksiazka[contains(tytul,"xml")] Wybierz autorów o imieniu "Stephen" //autor[starts-with(.,"stephen")] Wybierz tytuły złożone z ponad 20 znaków //tytul[string-length(.)>20]

Przykłady wyrażeń XPath (2/2) Wybierz książki, których numer ISBN spełnia wzorzec ***7197****** //ksiazka[substring(@isbn,4,4) = "7197"] Wybierz wszystkie węzły autorzy oraz wszystkie ich węzły potomne //autorzy/descendant-or-self::* Wybierz wszystkie książki, które w dokumencie znajdują się za książką o numerze ISBN "83-7197-786-7" //ksiazka[@isbn="83-7197-786-7"]/following::ksiazka Wybierz wszystkie atrybuty pierwszej książki //ksiazka[1]/attribute::* Wybierz cenę książki pt. "XML dla każdego" //ksiazka[tytul="xml dla każdego"]/child::cena

Transformacja wyrażeń skróconych do pełnych skrócone brak @... // pełne child:: attribute:: self::node() parent::node() /descendant-orself::node() przykład //ksiazka/cena => //ksiazka/child::cena //katalog/ksiazka[@isbn= "83-7197-786-7"] => //katalog/child::ksiazka[attribute::isbn= "83-7197-786-7"] //tytul[string-length(.)>10] => //tytul[string-length(self::node())>10] //autor/.. => //autor/parent::node() //tytul => /descendant-or-self::node()

Funkcje XPath w DOM API Java selectnodes(string) [interfejs Node] zwraca tablicę obiektów węzłów spełniających podaną ścieżkę XPath selectsinglenode(string) [interfejs Node] zwraca pierwszy znaleziony obiekt węzła spełniającego podaną ścieżkę XPath valueof(string) [interfejs Node] zwraca treść pierwszego znalezionego obiektu węzła spełniającego podaną ścieżkę XPath PL/SQL xslprocessor.selectnodes(domnode, Varchar2) zwraca tablicę obiektów węzłów spełniających podaną ścieżkę XPath xslprocessor.selectsinglenode(domnode, Varchar2) zwraca pierwszy znaleziony obiekt węzła spełniającego podaną ścieżkę XPath xslprocessor.valueof(domnode, Varchar2) zwraca treść pierwszego znalezionego obiektu węzła spełniającego podaną ścieżkę XPath

Java: zapytania XPath Wyświetl tytuły wszystkich książek wydanych w roku 2002 XMLDocument xmldoc; Node titlenode = null; NodeList querynodelist = null; 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 try { querynodelist = xmldoc.selectnodes("//ksiazka[rokwydania='2002']/tytul"); for (int i=0; i<querynodelist.getlength(); i++) { titlenode = querynodelist.item(i); System.out.println(titleNode.getFirstChild().getNodeValue()); } } catch (Exception e) {System.out.println(e);}

Java: zapytania XPath Wyświetl tytuły wszystkich książek, których jeden z autorów ma imię "Fabio" XMLDocument xmldoc; Node titlenode = null; NodeList querynodelist = null; C++ XML XML Kompendium programisty try { querynodelist = xmldoc.selectnodes("//tytul[../autorzy[contains(autor,'fabio')]]"); for (int i=0; i<querynodelist.getlength(); i++) { titlenode = querynodelist.item(i); System.out.println(titleNode.getFirstChild().getNodeValue()); } } catch (Exception e) {System.out.println(e);}

Java: zapytania XPath Wyświetl nazwisko pierwszego autora książki pt. "Java i XML" Brett McLaughlin try { System.out.println(xmlDoc.valueOf("//ksiazka[tytul='Java i XML']//autor")); } catch (Exception e) {System.out.println(e);}

PL/SQL: zapytania XPath Wyświetl tytuły wszystkich książek wydanych w roku 2002 declare xmldoc xmldom.domdocument; titlenode xmldom.domnode; querynodelist xmldom.domnodelist; begin querynodelist := xslprocessor.selectnodes(xmldom.makenode(xmldoc), '//ksiazka[rokwydania=''2002'']/tytul'); for i in 0..xmldom.getLength(queryNodeList) - 1 loop titlenode := xmldom.item(querynodelist, i); dbms_output.put_line(xmldom.getnodevalue(xmldom.getfirstchild(titlenode))); end loop; xmldom.freedocument(xmldoc); end; 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

PL/SQL: zapytania XPath Wyświetl tytuły wszystkich książek, których jeden z autorów ma imię "Fabio" declare C++ XML xmldoc xmldom.domdocument; XML Kompendium programisty titlenode xmldom.domnode; querynodelist xmldom.domnodelist; begin querynodelist := xslprocessor.selectnodes(xmldom.makenode(xmldoc), '//tytul[../autorzy[contains(autor,''fabio'')]]'); for i in 0..xmldom.getLength(queryNodeList) - 1 loop titlenode := xmldom.item(querynodelist, i); dbms_output.put_line(xmldom.getnodevalue(xmldom.getfirstchild(titlenode))); end loop; xmldom.freedocument(xmldoc); end;

PL/SQL: zapytania XPath Wyświetl nazwisko pierwszego autora książki pt. "Java i XML" Brett McLaughlin declare xmldoc xmldom.domdocument; begin dbms_output.put_line( xslprocessor.valueof(xmldom.makenode(xmldoc), '//ksiazka[tytul=''java i XML'']//autor')); end;