background image

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 

Transformacja dokumentów XML

Document Object Model - DOM

 

Modele programowania XML

Zorientowany na reguły (oparty na wzorcach).

Zorientowany na drzewa (oparty na strukturze).

Zorientowany na zdarzenia (oparty na strumieniowaniu). 

1. Orientacja na reguły. Program wykonuje reguły transformacyjne na danym 

dokumencie XML, powodując globalne zmiany w jego strukturze – XSLT 
(

eXtensible Stylesheet Language Transformations

). 

2. Orientacja na drzewa. Program trawersuje  i lokalnie modyfikuje drzewo 

dokumentu, stworzone w pamięci przez parser XML - DOM (

Document Object

Model

). 

3. Orientacja na zdarzenia. Program reaguje na zdarzenia zgłoszone przez parser

XML, gdy ten przetwarza dokument wejściowy XML – SAX (

Simple API for XML

). 

TAI    LJ

 

background image

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

XML w aplikacjach

Aplikacja korzystająca z danych zapisanych w dokumentach XML korzysta z 
procesora XML (parsera).  

Zadaniem aplikacji jest dostarczenie funkcji, które będą wywoływane dla 

konkretnych zdarzeń (callbacks). 

Sposób, w jaki aplikacja może przesyłać żądania do parsera i odbierać
informacje o zdarzeniach (czyli API parsera).

TAI    LJ

Rodzaje oprogramowania do przetwarzania dokumentów XML: 

- procesor XML, odczytuje i udostępnia strukturę i treść dokumentu,

- aplikacja, korzysta ze struktury i treści udostępnionej przez procesor XML,

Rodzaje parserów: 

- parsery DOM,

- parsery SAX.

 

Technologia DOM 

DOM - struktura służąca reprezentacji dokumentu XML oraz zbiór funkcji do 
operacji na tej strukturze.

Obiektowy model dokumentów XML, HTML.  

Standard W3C DOM definiuje zespół klas i interfejsów, pozwalających na 
dostęp do struktury dokumentów oraz jej modyfikacje. 

Struktura dokumentu ze znacznikami zostaje w całości wczytana do pamięci i 
udostępniona programowi w postaci hierarchii obiektów. 

TAI    LJ

Reakcja na błędy przekazywane przez model obiektu:

- Informacje o błędach są przekazywane za pomocą wartości zwracanej,

- Wyjątki są generowane jedynie wtedy, kiedy wystąpi błąd (warunek) 

nieodwracalny. 

- DOM powinien dostarczać opis do błędów.

 

background image

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 

Technologia DOM 

Standard modelowania dokumentów XML przy użyciu struktury drzewa. 
Znaczniki XML i ich zawartość są modelowane przez węzły drzewa, natomiast 
zagnieżdżanie znaczników służy wyznacza hierarchię drzewa.

Forma reprezentacji dokumentów XML w pamięci komputera. 

Transformacja dokumentu XML do postaci drzew DOM jest realizowana 
automatycznie przez parser DOM. 

Implementacja, adresowanie i przeszukiwanie drzew DOM mogą być
realizowane przy użyciu biblioteki DOM API. 

TAI    LJ

 

Technologia DOM 

DOM zapewnia:

Zbiór obiektów reprezentujących dokumenty XML i HTML.

Model łączenia obiektów. 

Standardowy interfejs umożliwiający dostęp i manipulację obiektami. 

Niezależność od platformy i języka programowania.

Rekomendację W3C.

TAI    LJ

 

background image

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Technologia DOM

<katalog>

<ksiazka kategoria=”Technika”>

<tytul> XML approach </tytul>
<autorzy>

<autor> Tom Rush </autor>
<autor> John Robson </autor>

</autorzy>
<wydawca> WILEY </wydawca>
<ISBN> 66-5454-777-1 </ISBN>
<rok> 2010 </rok>

</ksiazka>

. . . . . 
</katalog>

TAI    LJ

 

Struktura drzewa DOM 

< ksiazka >

Technika

<katalog>

< tytul >

< autorzy >

<wydawca>

<ISBN>

< rok >

< autor >

< autor >

XML 

approach

WILEY 

66-5454-777-1

2010

Tom

Rush

John

Robson

korzeń

węzeł elementu

węzeł atrybutu

węzeł tekstowy

legenda

<katalog>
<ksiazka kategoria=”Technika”>
<tytul> XML approach </tytul>
<autorzy>

<autor> Tom Rush </autor>
<autor> John Robson </autor>
</autorzy>
<wydawca> WILEY </wydawca>
<ISBN> 66-5454-777-1 </ISBN>
<rok> 2010 </rok>

</ksiazka>
. . . . . 
</katalog>

TAI    LJ

 

background image

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

Poziomy DOM

DOM Level 1 (1998r.) - umożliwia dostęp do treści dokumentu poprzez 

tworzenie, modyfikowanie oraz dołączanie elementów i atrybutów. 

DOM Level 2 (2000) - dodatkowo wprowadza możliwość obsługi zdarzeń i 
przestrzeni nazw. Wprowadzono kilka poprawek do części Core poprzedniej 

wersji. 

DOM Level 3 (2004) - najnowsza (trzecia) wersja standardu poprawiono części  

Core oraz Events. 

DOM Level 0 (nieoficjalny) - Model DOM z przeglądarki Netscape 3.0, 

umożliwia dostęp tylko do pól formularzy. Nie jest standardem W3C 

TAI    LJ

 

Wymagania odnośnie DOM

Model DOM jest językowo obojętny.

Jądro DOM powinno być w stanie przetwarzać dokumenty XML, HTML i CSS.

Model DOM może być użyty do wczytywania i zapisywania dokumentu.

Konwencja nazewnictwa musi być jednakowa na wszystkich poziomach DOM. 

Model DOM nie powinien narażać aplikacji użytkownika na błędy związane z 

bezpieczeństwem, walidacją i prywatnością.  

TAI    LJ

 

background image

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Obiekty DOM

DOM Level 1: 

Core - obiekty reprezentujące strukturę dokumentu. Pozwalają na 

przetwarzanie struktury dokumentu.

HTML - podstawowe metody dostępu do struktury dokumentu.

DOM Level 2: 

Events

- obsługa zdarzeń. 

Style

- manipulowanie arkuszami stylów.

Views

- "widoki" drzewa dokumentu po zastosowaniu stylów CSS.

Traversal&Range - sposoby nawigowania po dokumencie XML.

DOM Level 3: 

Części Core oraz Events są poprawione.

Load & Save - ładowanie i zapisywanie dokumentu.

Validation

- dostęp do definicji struktury dokumentu (DTD).

XPath

- dostęp do węzłów DOM przez wyrażenia XPath

TAI    LJ

 

Model dokumentu

Węzły elementowe: zawierają węzły potomne: elementowe, tekstowe lub obu 
rodzajów.

Węzły atrybutowe: informacja podległa konkretnemu węzłowi elementowemu.

Węzeł dokumentu: rodzic dla wszystkich pozostałych węzłów.

CData: odpowiada sekcji znakowej, zawierającej zawartość nie 
przeznaczoną do przetwarzania.

Comment: komentarz.

ProcessingInstruction: instrukcja przetwarzania.

DocumentFragment: stosowany jako węzeł roboczy przy budowaniu lub 
rekonstruowaniu dokumentu XML.

Pozostałe - Entity, EntityReference, Notation. 

TAI    LJ

 

background image

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

DOM API

DOMImplementation - sprawdzenie, czy dana funkcjonalność jest 
zaimplementowana, tworzenie nowej instancji dokumentu, tworzenie nowego 
typu dokumentu.

Document - reprezentuje drzewo dokumentu, udostępnia korzeń drzewa. 

DocumentFragment - umożliwia przetwarzanie części drzewa dokumentu.

Node - podstawowy interfejs podstawowy, z którego dziedziczy większość
obiektów DOM. Umożliwia przekształcanie drzewa dokumentu. 

NodeList - reprezentuje listę obiektów typu Node.

Element - modeluje węzeł reprezentujący parę znaczników XML 

Text - reprezentuje treść umieszczoną wewnątrz pary znaczników XML. 

Attr - umożliwia operowanie na atrybutach. Reprezentuje atrybut znacznika 
XML w formie tzw. węzła atrybutu.

TAI    LJ

 

DOMImplementation - metody

hasFeature(s) - sprawdza, czy dana funkcjonalność jest 
zaimplementowana. 

createDocument(s)  - tworzy nowe drzewo dokumentu.

createDocumentType(s) - tworzy nowy typ dokumentu.

TAI    LJ

 

background image

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Obiekt Document – metody

createElement(s) - tworzy element o określonej nazwie.

createAttribute(s) - tworzy atrybut o określonej nazwie.

createTextNode(s) - tworzy węzł tekstowy elementu.

createComment(s) - tworzenia komentarza. 

createCDATASection(s) - tworzy sekcję CDATA. 

createProcessingIntrucion(s) - tworzy instrukcję przetwarzania. 

createEntityReference(s) - tworzy wskazania na jednostkę o 
określonej nazwie 

createOocunientFragment(s) - tworzy obiekt reprezentujący fragment 
dokumentu.

getElementsByTagName(s) - wyszukuje listy węzłów. 

TAI    LJ

 

Obiekt Document – metody

DOM level 2 (przestzrenie nazw):

createElementNS(s) - przeznaczona jest do tworzenia elementu 
należącego do określonej przestrzeni nazw. 

createAttributeNS(s) - służy do tworzenia atrybutu należącego do 
określonej przestrzeni nazw. 

etElementsByTagNameNS(s) - służy do wyszukiwania listy węzłów o 
określonej nazwie, należących do zadanej przestrzeni nazw.  

TAI    LJ

 

background image

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Obiekt Document – atrybuty

doctype - wskazuje na typ dokumentu (DocumentType).

implementation - wskazujący na implementację dokumentu 
(DOMImplementation).

element - wskazujący na element główny, korzeń drzewa (Element). 

TAI    LJ

 

Budowanie drzewa dokumentu

<AUTOR>

<IMIE> Steven  </IMIE>
<NAZWISKO> Schafer </NAZWISKO>

</AUTOR> 

import org.w3.dom.*; 
public class DOM
{

public static void main(String[] args)
{
DOMlmplenmentation domImp = 

new org.apache.xerces.dom.DOMImplementationImpl();

Document nowyDOM = domIml.createDocument(“null”,”autor”,null); 
Element korzen = nowyDOM.getDocumentElement();
Element imieElement = nowyDOM.createElement(“imie”;
Element nazwiskoElement = nowyDOM.createElement(“nazwisko”);
Text imieText = nowyDOM.createTextNode(”Steven”);

Text nazwiskoText = nowyDOM.createTextNode(Schafer); 
imieElement.appendChild(imieText); 
nazwiskoElement.appendChild(nazwiskoText);

korzen.appendChild(imieElement); 
korzen appendChildd(nazwiskoElement);
}

}

TAI    LJ

 

background image

 

10 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Obiekt Node - metody

insertBefore(n) - wstawianie nowego węzła przed już istniejący,

removeChild(n) - usuwanie określonego węzła. 

appendChild(n) - dodanie nowego węzła,

hasChildNodes(n) - sprawdza, czy dany węzeł posiada węzły-dzieci 

cloneNode(n) - kopiowanie określonego węzła. 

hasAttributes(n) - określa, czy dany węzeł (jeśli jest elementem) 
zawiera atrybuty.

TAI    LJ

 

Atrybuty DOM2 

nodeName

nazwa węzła.

nodeValue

wartość węzła.

nodeType

typ węzła. 

parentNode

węzeł-rodzic. 

childNodes

zbiór węzłów-dzieci (NodeList). 

firstChild

pierwsze dziecko.

lastChild

ostatnie dziecko.

previousSibling węzeł: poprzedzające rodzeństwo.

nextSibling

węzeł: kolejne rodzeństwo.

attributes

zbiór atrybutów (NamedNodeMap).

ownerDocument

obiekt Docurnent, w którym znajduje się dany węzeł.

TAI    LJ

 

background image

 

11 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

Atrybuty DOM2 

Level 2 zawiera atrybuty nieistniejące w wersjach wcześniejszych: 

namespaceURI - wskazywać na przestrzeń nazw, do której należy węzeł.

prefix

- prefiks, opisujący przestrzeń nazw. 

localName

- ten atrybut określa lokalną nazwę danego  węzła (bez 

prefiksu).

TAI    LJ

 

Hierarchia drzewa dokumentu

TAI    LJ

Węzeł

Węzeł

Węzeł

parentNode

lastChild

nextSibling

Węzeł

Węzeł

Węzeł

Węzeł

firstChild

previousSibling

ęę

ęzełłłł

odniesienia

Child

 

background image

 

12 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

Hierarchia węzłów - Oś

ancestor - dotyczy przodków węzła kontekstowego.

ancestor-or-self - dotyczy węzła kontekstowego i jego przodków.

attribute - dotyczy atrybutów węzła kontekstowego. 

child - dotyczy dzieci węzła kontekstowego.

descendant - dotyczy potomków węzła kontekstowego.

descendant-or-self - dotyczy węzła kontekstowego i jego potomków.

following - dotyczy wszystkich węzłów do którego należy węzeł kontekstu, 

które znajdują się po nim.

following-sibling - dotyczy wszystkich węzłów znajdujących się na 

tym samym poziomie co węzeł kontekstu, za tym węzłem.

TAI    LJ

 

Hierarchia węzłów - Oś

namespace - dotyczy wezłów przestrzeni nazw węzła kontekstu.

parent -

dotyczy węzła rodzica węzła kontekstowego.

preceding - dotyczy wszystkich węzłów z dokumentu, do którego należy 

węzeł kontekstu, które znajdują się przed nim,

preceding-sibling - dotyczy wszystkich węzłów znajdujących się na 

tym samym poziomie co węzeł kontekstu, przed tym węzłem,

self - zawiera węzeł kontekstowy.

TAI    LJ

 

background image

 

13 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Obiekt NodeList

Obiekt NodeList - atrybuty:

length

liczba elementów na liście.

Obiekt NodeList - atrybuty:

item(i)

zwraca i-ty element listy

TAI    LJ

 

Obiekt Element - metody

TAI    LJ

getAttribute(String nazwa) - służy do pobrania wartości 
określonego atrybutu,

setAttribute(String nazwa, String wartosc) - służy do 
przypisania wartości określonemu atrybutowi .

removeAttribute(String nazwa) - usuwa wartości określonego 
atrybutu,

getAttributeNode(String nazwa) -

pobiera atrybut (obiekt typu Attr) 

o określonej nazwie,

setAttributeNode(Attr atrybut) - dodaje nowy atrybut do elementu,

removeAttributeNode(Attr atrybut) - usuwa z elementu określony 
atrybut.   

tagName - (właściwość) - nazwa węzła

 

background image

 

14 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Przykład

NodeList lista = elem.getElementsByTagName(”pozycja”);
if (lista.getLength()>O)
{

Element wezel = (Element)lista.item(0);
if wezel.hasAttriubte(“wezel”)
{
String waluta = wezel.getAttribute(“waluta”);
if (waluta.equals(“$”)) 
wezel.setAttribute(“waluta”,”ZL”);
}

}

Zmiana wartości atrybutu waluta w pierwszym elemencie pozycja.

TAI    LJ

 

Obiekt Attr i Text 

name - reprezentuje nazwę atrybutu.

specified - określa, czy wartość atrybutu została nadana w aplikacji, czy jest 
domyślną wartością pobraną z DTD dokumentu.

value - określa wartość atrybutu. 

ownerElement - zawiera odwołanie do elementu, do którego należy badany 
atrybut.

Obiekt Attr Reprezentuje węzeł atrybutowy. Dostęp do atrybutów może odbywać
się poprzez zmienne zawarte w obiekcie interfejsu Attr:

Obiekt klasy/typu Text reprezentuje treść umieszczoną wewnątrz znacznika XML.

TAI    LJ

 

background image

 

15 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

DOM API

Bazowa cześć specyfikacji DOM umożliwia:

Budowanie dokumentów.

Nawigację po strukturze dokumentów.

Dodawanie elementów i atrybutów. 

Modyfikacje elementów i atrybutów.

Usuwanie elementów/atrybutów i ich zawartości. 

TAI    LJ

 

Wady DOM

Duże zapotrzebowanie na pamięć.

Niska efektywność.

Skomplikowany model dostępu do węzłów. 

Interfejs programistyczny DOM. 

Model dokumentu XML jako drzewa obiektów.

Węzeł drzewa = obiekt. 

TAI    LJ

 

background image

 

16 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Zalety DOM

Intuicyjny w użytkowaniu.

Standard W3C.

Swobodny dostęp do elementów dokumentu, mżliwość jego modyfikacji i 
zapisu. 

Możliwość modyfikacji i tworzenia dokumentów, swobodny dostęp do danych. 

TAI    LJ

 

Transformacja dokumentów XML

(Simple API for XML - SAX)

Przetwarzanie strumieniowe SAX

http://www.saxproject.org

 

background image

 

17 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

Standard SAX

Podstawowe własności:

zdarzeniowość (event driven) - podczas przetwarzania procesor SAX informuje 

o napotkaniu znaczników początkowych oraz końcowych, atrybutów, sekcji 
CDATA itp.

strumieniowość - w danej chwili badany jest tylko drobny fragment dokumentu, 
nie ma możliwości zatrzymania bądź zmiany kierunku przetwarzania.

elastyczność - określone są jedynie ramy całej aplikacji (w postaci interfejsów i 
podstawowych klas).

TAI    LJ

 

Standard SAX

SAX API - 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 
obiektu klasy przygotowanej przez programistę.

SAX API umożliwia konwersję dokumentu XML do dowolnej struktury danych, a 
nie wyłącznie do drzewa DOM.

Zadaniem programisty jest przygotowanie klasy dziedziczącej z
D

ocumentHandler

i oprogramowanie jej metod:

- startDocument() / endDocument()

- startElement() / endElement()

- characters()   

TAI    LJ

 

background image

 

18 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

Zasada działania SAX 

SAX traktuje dokument XML jako strumień danych, który jest
odczytywany sukcesywnie w czasie parsowania.

API SAX oparte jest o mechanizm zdarzeń, które są generowane podczas 
parsowania elementu.

Zdarzenie wywołuje zarejestrowaną funkcję zwrotną (

callback

).  

TAI    LJ

Wywołanie
zdarzenia

Dokument

XML

PARSER SAX

Przetwarzanie

APLIKACJA

 

Zasada działania SAX 

Aplikacja zawiera analizator składni (parser) XML.

Parser przetwarza pliki XML w różnych fazach działania aplikacji.

SAX został zaprojektowany dla Javy w formie interfejsów i klas w pakietach 
org.xml.sax i org.xml.sax.helpers.

Technologia SAX jest określana jako interfejs zdarzeniowy programista 
definiuje przetwarzanie dokumentu w postaci obsługi odpowiednich, 
predefiniowanych rodzajów zdarzeń, które są generowane sekwencyjnie 
podczas wczytania dokumentu. Zdarzeniami są np. napotkanie znaczników 
otwierających, zamykających, atrybutów itd.

Przetwarzanie strumieniowe. Dokument jest wczytywany od początku do 
końca i w tej kolejności generowana jest odpowiednia sekwencja zdarzeń.    

TAI    LJ

 

background image

 

19 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Podstawowe zdarzenia

początek dokumentu startDocument.

koniec dokumentu

endDocument

.

początek elementu startElement

koniec elementu

endElement

odebrany tekst - zawartość tekstowa elementu characters.

odebrany tekst - przejście do następnej linii lub inny znak biały    

TAI    LJ

 

Standard SAX

Zalety: 

- Prostota implementacji.

- Małe zapotrzebowanie na pamięć.

- Sekwencyjne wczytywanie pliku.

- Szybkość.

TAI    LJ

Wady: 

- Złożona obsługa.

- Brak dostępu do całego pliku XML.

- Tylko odczyt.

 

background image

 

20 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 

awigacja i wyszukiwanie

XPath

 

XPath

XPath wykorzystywany w standardach: 

W transformacjach XSLT do określania, które fragmenty dokumentu XML mają
podlegać danej transformacji.

W odsyłaczach XLink - do wskazywania (adresowania) części dokumentu XML 
w odesłaniach hipertekstowych.

W wyrażeniach XPointer (rozszerzenie XPath).

W schematach XML-Schema do zapewnienia unikatowości w elementach i 
atrybutach niepowtarzalnych.

W pytaniach XQuery - do tworzenia zapytań.

TAI    LJ

Status:

wersja 1.0 – rekomendacja W3C (1999 r.)

wersja 2.0 – candidate recommendation (2006r.).

 

background image

 

21 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

XPath

Technologia XPath:  

XPath - specyfikacja języka służącego do adresowania, odczytywania i 
przeszukiwania drzew DOM dokumentów XML.

XPath używa opisu “ścieżek” do nawigowania po dokumencie XML (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 zawiera wbudowaną bibliotekę standardowych funkcji.

XPath jest głównym elementem XSLT.

XPath jest standardem W3C.

TAI    LJ

 

XPath

XPath (wersja 1.0) wyróżnia następujące typy zwracanych wartości: 

Boolean - wartość logiczna.

number - liczba 

string - łańcuch tekstu.

node-set - zbiór węzłów (zbiór uporządkowany, podtrzymuje oryginalną
kolejność pobranych elementów). 

TAI    LJ

 

background image

 

22 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

Budowa wyrażeń XPath

Ścieżka 

(location path)

(ciąg określający przetwarzanie) jest zbudowana z kroków,

Oddzielonych symbolem "/„. Krok może reprezentować:  

Element.

Atrybut.

Wywołanie funkcji.

Ścieżki we wzorcu (pattern), poprzedzielane są symbolem „ „

TAI    LJ

Wzorzec

dane/pozycja[1]

dane/pozycja[2]/kwota@nr=4

dane/pozycja[3]

Ś

ŚŚ

Ścież

żż

żka

Ś

ŚŚ

Ścież

żż

żka

Ś

ŚŚ

Ścież

żż

żka

Ś

ŚŚ

Ścież

żż

żka

dane

/

pozycja[2]

/

kwota@nr=4

Krok

Krok

Krok

 

Drzewo węzłów

XPath rozróżnia siedem typów węzłów:  

Element. 

Tekst.  

Przestrzeń nazw.

Instrukcję przetwarzania. 

Komentarz. 

Węzeł dokumentu. 

TAI    LJ

 

background image

 

23 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

Drzewo węzłów

Relacje w drzewie węzłów:

Rodzic (parent) - dziecko (child). 

Rodzeństwo (sibling): poprzednik-następnik.

Przodek (ancestor) - potomek (descendant).

TAI    LJ

 

Operatory nawigacji 

Operatory nawigacji (osie (axes)):

Self - bieżący węzeł (zwany kontekstem: context node ),

Parent - rodzic aktualnego węzła (pusty dla węzła korzenia),

Child - bezpośrednie podelementy

Descendant - całe drzewo podelementów poniżej aktualnego,

Descendant-or-self – potomkowie oraz aktualny węzeł,

Ancestor - przodkowie aktualnego węzła

Ancestor-or-self - przodkowie oraz aktualny węzeł

Following-sibling - kolejne węzły na tym samym poziomie hierarchii.

Preceding-sibling - wcześniejsze węzły na tym samym poziomie

Following - wszystkie kolejne węzły (bez potomków),

Preceding - wszystkie poprzednie węzły (bez przodków).

TAI    LJ

 

background image

 

24 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Budowa kroku w wyrażeniu XPath

Składnia pojedynczego kroku ma następującą strukturę:

1.

Kierunek (axis) 

2.

Podwójny dwukropek "::"

3.

Symbol "*" (selekcjonuje dowolny element) 

4.

Nazwa elementu, albo wywołanie funkcji:
-

node() - dowolny węzeł widoczny z bieżącego kontekstu,

-

text() - zawartość tekstowa bieżącego węzła-kontekstu

-

comment() - komentarze w bieżącym kontekście 

-

processing-instruction() - instrukcje przetwarzania w bieżącym 
kontekście.

TAI    LJ

 

Budowa kroku w wyrażeniu XPath

Składnia pojedynczego kroku ma następującą strukturę:

1. self::* - dostęp do aktualnego węzła.

2. preceding::pozycja - dostęp do poprzedzających aktualny węzeł

elementów o nazwie pozycja.

3. preceding::text() - dostęp do poprzedzających aktualny węzeł

zawartości tekstowych.

4. following-sibling::node() - dostęp do elementów występujących na 

tym samym poziomie, co aktualny węzeł i będących jego następnikami.

5. following-sibling::comment() - dostęp do komentarzy występujących 

na tym samym poziomie, co aktualny węzeł i będących jego następnikami.

6. ancestor: :procesing-instruction() - dostęp do instrukcji 

przetwarzania występujących w węzłach-przodkach.

TAI    LJ

 

background image

 

25 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

Skróty w wyrażeniach ścieżkowych

..

parent::node()

Rodzic aktualnego węzła

//

descendant-or-self::node()

Potomkowie lub aktualny węzeł

.

self::node()

Aktualny węzeł

@

attribute::

Atrybut

[2]

[position()=2]

Drugi z potomnych elementów

Skrót

Wyrażenie

Znaczenie

Child::

Dzieci aktualnego węzła 

TAI    LJ

 

Skróty w wyrażeniach ścieżkowych

child jest kierunkiem domyślnym. Słowo kluczowe reprezentujące ten kierunek 
nawigacji może być pominięte. Zatem zapisowi: 

TAI    LJ

/descendant-or-self::node()/child::para

odpowiadać może:

//child::para

a w konsekwencji:

//para 

/child::firma/child::dzial/child::pracownik[position()=1] 

/firma/dzial/pracownik[1]

Wyselekcjonowanie pierwszego elementu pracownik z każdego elementu dział
znajdującego się w elemencie-korzeniu firma. 

 

background image

 

26 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Skróty w wyrażeniach ścieżkowych

TAI    LJ

1.

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/*

2.

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ążkę

//ksiazka[last()]

 

Skróty w wyrażeniach ścieżkowych

TAI    LJ

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ła Konopnicka,

//ksiazka[autorzy/autor="Konopnicka"]

4.

Alternatywa ścieżek: 

-

wybierz tytuły książek i wydawnictwa,

//tytul|//wydawnictwo

-

wybierz tytuły książek napisanych przez Konopnicką i Orzeszkową , 

//tytul[..//autor="Konopnicka"]|//tytul[..//autor=" 

Orzeszkowa"]

 

background image

 

27 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 

Skróty w wyrażeniach ścieżkowych

TAI    LJ

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ła Konopnicka,

//ksiazka[autorzy/autor="Konopnicka"]

4.

Alternatywa ścieżek: 

-

wybierz tytuły książek i wydawnictwa,

//tytul|//wydawnictwo

-

wybierz tytuły książek napisanych przez Konopnicką i Orzeszkową, 

//tytul[..//autor="Konopnicka"]|//tytul[..//autor=" 

Orzeszkowa"]

 

Skróty w wyrażeniach ścieżkowych

TAI    LJ

5.

Wybór węzłów zawierających atrybuty: 

-

wybierz książkę o numerze ISBN "88-7777-1111-X",

//ksiazka[@isbn="88-7777-1111-X"]

-

wybierz wszystkie numery ISBN, 

//@isbn

6.

Odczyt treści węzła: 

-

odczytaj treści wszystkich tytułów książek,

//ksiazka/tytul/text() 

 

background image

 

28 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

Pełne wyrażenia XPath

TAI    LJ

1.

Wyrażenie ścieżkowe XPath składa się z tzw. kroków rozdzielonych ukośnikami.

2.

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.

3.

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]

 

Pełne wyrażenia XPath

TAI    LJ

1.

Wybierz książki, których cena nie przekracza 20 zł:

//ksiazka[cena<=20]

2.

Wybierz tytuły książek o cenach w przedziale 30-40 zł:

//ksiazka/tytul[../cena>30 and../cena<40]

3.

Wybierz książki napisane przez więcej niż dwóch autorów:

//ksiazka[count(autorzy/autor)>2]

4.

Wybierz co drugą książkę: 

//ksiazka[position()mod 2 = 1]

5.

Wybierz książki zawierające w tytule słowo XML:

//ksiazka[contains(tytul,"XML")]

6.

Wybierz tytuły złożone z ponad 20 znaków:

//tytul[string-length(.)>20]

 

background image

 

29 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Pełne wyrażenia XPath

TAI    LJ

1.

Wybierz książki, których numer ISBN spełnia wzorzec ***7197******:

//ksiazka[substring(@isbn,4,4) = "7197"]

2.

Wybierz wszystkie węzły autorzy oraz wszystkie ich węzły potomne: 

//autorzy/descendant-or-self::*

3.

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

4.

Wybierz wszystkie atrybuty pierwszej książki: 

//ksiazka[1]/attribute::*

5.

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

TAI    LJ

1.

Wybierz książki, których numer ISBN spełnia wzorzec ***7197******:

//ksiazka[substring(@isbn,4,4) = "7197"]

skrócone

pełne

przykład

brak

child::

//ksiazka/cena =>
//ksiazka/child::cena

@

attribute::

//katalog/ksiazka[@isbn= "83-7197-786-7"] =>
//katalog/child::ksiazka[attribute::isbn= "83-7197-786-7"]

.

self::node()

//tytul[string-length(.)>10] =>
//tytul[string-length(self::node())>10]

..

pelne

//autor/.. =>
//autor/parent::node()

//

/descendant-or-
self::node()

//tytul =>
/descendant-or-self::node()

 

background image

 

30 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 

Predykaty 

Operatory porównania:

=

!=

>

>=

&lt;

&lt;= 

Operatory logiczne: 

and 

or

not

Operatory arytmetyczne

+

-

*

div

mod

//dane/pozycja[okres = ”Styczeń”] - oznacza wybranie elementów 
pozycja, dla których podelement okres ma wartość ”Styczeń”;

//pozycja[wartosc*1.22 >1000] - oznacza wybranie elementów 
pozycja, dla których iloczyn elementu wartosc oraz liczby 1,22 jest większy 
od 1000;

TAI    LJ

 

Funkcje wbudowane 

Tekstowe:

concat(łańcuch1, łańcuch2, ...) - konkatenacja.

contains(łańcuch, wzorzec) - sprawdzenie, czy zawiera podłańcuch 
równy wzorcowi.

normalize-space(łańcuch) - normalizacja (usunięcie spacji 
nadmiarowych).

starts-with(łańcuch, wzorzec) - sprawdzenie, czy łańcuch zaczyna 
się od podanego wzorca.

string-length(łańcuch) - bada długość wzorca.

TAI    LJ

 

background image

 

31 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 

Funkcje wbudowane 

Liczbowe:

ceiling(liczba), floor(liczba), round(liczba) - zaokrąglenia.

sum(wyraŜenie_zwracające_zbiór_węzłów) - sumowanie wartości z 
węzłów zwracanych przez wyrażenie.

number(...) - konwersja wartości innego typu na number

Logiczne: 

false(),true(),not() - wartości prawda, fałsz oraz funkcja zanegowania.

boolean() - konwersja wartości innego typu na boolean.

TAI    LJ

 

Funkcje dotyczące węzłów

Liczbowe:

ceiling(liczba), floor(liczba), round(liczba) - zaokrąglenia.

sum(wyraŜenie_zwracające_zbiór_węzłów) - sumowanie wartości z 
węzłów zwracanych przez wyrażenie.

number(...) - konwersja wartości innego typu na number

Logiczne: 

false(),true(),not() - wartości prawda, fałsz oraz funkcja zanegowania.

boolean() - konwersja wartości innego typu na boolean.

TAI    LJ