1
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
2
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.
3
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
4
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
5
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
6
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
7
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
8
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
9
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
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
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
Wę
ęę
ęzełłłł
odniesienia
Child
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
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
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
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
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
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
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
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.
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.).
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
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
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
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
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.
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"]
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()
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]
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()
30
Predykaty
Operatory porównania:
=
!=
>
>=
<
<=
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
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