630 likes | 812 Views
Języki zapytań dla XML. XPath XQuery. Plan wykładów. Wprowadzenie do XML Struktura dokumentów XML Języki zapytań dla XML XML a bazy danych. Plan wykładu. XPath XQuery. XPath 1.0. Język umożliwiający wskazywanie elementów, atrybutów i całych fragmentów dokumentu XML
E N D
Języki zapytań dla XML XPath XQuery
Plan wykładów • Wprowadzenie do XML • Struktura dokumentów XML • Języki zapytań dla XML • XML a bazy danych
Plan wykładu • XPath • XQuery
XPath 1.0 • Język umożliwiający wskazywanie elementów, atrybutów i całych fragmentów dokumentu XML • Rekomendacja W3C (1999) • Wykorzystywany w: XSLT, XLink, XQuery
XPath 1.0 Możliwości: • Nawigacja po drzewiastej strukturze dokumentu • Korzystanie z funkcji • Przetwarzanie tekstu • Korzystanie z wyrażeń zagnieżdżonych
Struktura dokumentu • Struktura dokumentu XML może zostać przedstawiona w postaci drzewa • Drzewo dokumentu zawiera węzły • element, atrybut, tekst, przestrzeń nazw, instrukcja przetwarzania, komentarz, dokument • XPath rozróżnia pokrewieństwo między poszczególnymi węzłami
Struktura dokumentu <Pracownicy> <Pracownik pesel="56022812345"> <Nazwisko> Jaworek </Nazwisko> <Data_przyjecia>01.10.1980</Data_przyjecia> <Zespol> Projektowania </Zespol> </Pracownik> </Pracownicy>
document element element element element element Struktura dokumentu attribute text text text
Struktura dokumentu Do węzłów można się odnosić poprzez odwołanie do: • Rodzaju węzła • Nazwy węzła
Struktura dokumentu Odwołanie do rodzaju węzła: • node() • text() • comment() • element() • ...
Struktura dokumentu Odwołanie do nazwy węzła: • Dotyczy elementu lub atrybutu • W odwołaniu należy podać nazwę elementu lub atrybutu • Znak * zastępuje dowolną nazwę
XPath – wyrażenia • Podstawowym wyrażeniem języka XPath jest ścieżka (ang. path) • Ścieżka pozwala na lokalizację węzłów w dokumencie • Ścieżka składa się z jednego lub więcej kroków (ang. step) oddzielonych znakiem „ / ” • Krok definiuje kierunek poruszania się po drzewie dokumentu oraz węzeł docelowy lub wyrażenie filtrujące • Zbiór alternatywnych ścieżek oddzielonych „|” tworzy wzór (ang. pattern)
XPath – wyrażenia Wyrażenia XPath zwracają wartości typu: • boolean – wartość logiczna • node-set – zbiór węzłów • number – wartość liczbowa • string – łańcuch znaków
Wyszukiwanie node() text() … child descendent-or-self … path child::node()
<?xml version="1.0" encoding="UTF-8" ?> <budowla> <zamek numer="1" krolewna="Brak" smok="Brak"> <opis>Ładny</opis> <wartosc>250000</wartosc> <wiek>750</wiek> </zamek> <zamek numer="2" krolewna="Jest" smok="Brak"> <opis>Ładny. Królewna oczekuje na księcia :)</opis> <wartosc>499000</wartosc> <wiek>610</wiek> </zamek> <zamek numer="3" krolewna="Jest" smok="Jest"> <opis>Interesujący. Ładny. Niebezpieczny.</opis> <wartosc>990000</wartosc> <wiek>900</wiek> </zamek> </budowla>
średniowiecze.xml D budowla E krolewna numer zamek smok A E A A opis wartosc wiek E E E T T T
Przykładowe ścieżki • child::text() - dostęp do zawartości tekstowej węzłów dzieci • parent::node() – do elementu rodzica • self::* - do aktualnego węzła • following-sibling::comment() – do komentarzy występujących na tym samym poziomie co dany węzeł ale następujących po nim • descendant::zamek – do wszystkich elementów zamek, potomków aktualnego węzła
Przykładowe ścieżki • /child::budowla/child::zamek/child::opis – dostęp do elementów o nazwie opis, będących dziećmi elementów o nazwie zamek, które są dziećmi korzenia dokumentu Wynik: <opis>Ładny</opis> <opis>Ładny. Królewna oczekuje na księcia :)</opis> <opis>Interesujący. Ładny. Niebezpieczny.</opis>
Przykładowe ścieżki • /child::budowla/child::*/child::wartosc – dostęp do elementów o nazwie wartość, będących dziećmi wszystkich elementów będących dziećmi korzenia dokumentu Wynik: <wartosc>250000</wartosc> <wartosc>499000</wartosc> <wartosc>990000</wartosc>
Dostęp do atrybutów • Słowo kluczowe attribute • Dostęp w kolejnym kroku, czyli wykorzystanie „/” /child::budowla/child::zamek/attribute::numer Wynik: 1 2 3
Przykładowe ścieżki Zastosowanie skrótów /child::budowla/child::zamek/child::opis <=> /budowla/zamek/opis /child::budowla/child::*/child::wartosc <=> /budowla/*/wartosc /child::budowla/child::zamek/attribute::numer <=> /budowla/zamek/@numer
Wyrażenia filtrujące • Umieszczane w nawiasach klamrowych [ ] • Wykorzystywane do zawężania obszaru poszukiwań • Wykorzystują część funkcji XPath, operatory porównania i operatory logiczne
Operatory • Porównania: =, !=, >, >=, <, <= • Logiczne: and, or, not • Arytmetyczne:+, -, *, div, mod
<?xml version="1.0" encoding="UTF-8" ?> <budowla> <zamek numer="1" krolewna="Brak" smok="Brak"> <opis>Ładny</opis> <wartosc>250000</wartosc> <wiek>750</wiek> </zamek> <zamek numer="2" krolewna="Jest" smok="Brak"> <opis>Ładny. Królewna oczekuje na księcia :)</opis> <wartosc>499000</wartosc> <wiek>610</wiek> </zamek> <zamek numer="3" krolewna="Jest" smok="Jest"> <opis>Interesujący. Ładny. Niebezpieczny.</opis> <wartosc>990000</wartosc> <wiek>900</wiek> </zamek> </budowla>
Przykłady wyrażeń filtrujących /budowla/zamek[opis = ‘Ładny’] Wynik: <zamek numer="1" krolewna="Brak" smok="Brak"> <opis>Ładny</opis> <wartosc>250000</wartosc> <wiek>750</wiek> </zamek>
Przykłady wyrażeń filtrujących /budowla/zamek[@numer < 3] Wynik: <zamek numer="1" krolewna="Brak" smok="Brak"> <opis>Ładny</opis> <wartosc>250000</wartosc> <wiek>750</wiek> </zamek> <zamek numer="2" krolewna="Jest" smok="Brak"> <opis>Ładny. Królewna oczekuje na księcia :)</opis> <wartosc>499000</wartosc> <wiek>610</wiek> </zamek>
Przykłady wyrażeń filtrujących /budowla/zamek[(@smok=‘Jest’) and (@krolewna=‘Jest’)] Wynik: <zamek numer="3" krolewna="Jest" smok="Jest"> <opis>Interesujący. Ładny. Niebezpieczny.</opis> <wartosc>990000</wartosc> <wiek>900</wiek> </zamek>
Przykłady wyrażeń filtrujących /budowla/zamek[number(wartosc) > (number(wiek)*1000)] Wynik: <zamek numer="3" krolewna="Jest" smok="Jest"> <opis>Interesujący. Ładny. Niebezpieczny.</opis> <wartosc>990000</wartosc> <wiek>900</wiek> </zamek>
Przykłady wyrażeń filtrujących //zamek[*=‘Ładny’] – badanie elementów potomnych Wynik: <zamek numer="1" krolewna="Brak" smok="Brak"> <opis>Ładny</opis> <wartosc>250000</wartosc> <wiek>750</wiek> </zamek>
Przykłady wyrażeń filtrujących //zamek[@*=‘Brak’] – badanie atrybutów Wynik: <zamek numer="1" krolewna="Brak" smok="Brak"> <opis>Ładny</opis> <wartosc>250000</wartosc> <wiek>750</wiek> </zamek> <zamek numer="2" krolewna="Jest" smok="Brak"> <opis>Ładny. Królewna oczekuje na księcia :)</opis> <wartosc>499000</wartosc> <wiek>610</wiek> </zamek>
Przykłady wyrażeń filtrujących /budowla/zamek[@numer=1]/opis Wynik: <opis>Ładny</opis> //zamek[wiek > 700]/wartosc Wynik: <wartosc>250000</wartosc> <wartosc>990000</wartosc>
Funkcja position() • Wybór z drzewa dokumentu węzła o określonym numerze wystąpienia • Zlicza wyłącznie dzieci, nie pozwala na sprawdzanie zagnieżdżonej struktury /budowla/zamek[position()=2] /budowla/zamek[position()!=3] /budowla/zamek[2]
Funkcje operujące na łańcuchach concat(string l1, string l2,...) – łączenie contains(string l1, string wzorzec) – czy l1 zawiera wzorzec starts-with (string l1, string wzorzec) – czy l1 zaczyna się od wzorca substring(string l1, number pocz, number kon) substring-after, substring-before, translate ...
Inne funkcje Funkcje operujące na liczbach (number):ceiling, floor, round, number Funkcje operujące na węzłach: position, sum, count, last
Plan wykładu • XPath • XQuery
Wymagania W3C dla języka zapytań XML • Przynajmniej jedna składnia XML • Deklaracyjność • Niezależność od protokołu komunikacyjnego • Respektowanie składni XML, przestrzeni nazw i XML Schema • Wsparcie dla prostych i złożonych typów danych • Wsparcie dla operacji na hierarchiach i sekwencjach struktur dokumentów • Łączenie informacji z wielu dokumentów • Agregacja • Transformacja między strukturami dokumentów
XQuery • XQuery 1.0 jest generalizacją XPath 2.0 • XQuery wykorzystuje do poruszania się po drzewie danych ścieżki zdefiniowane w języku XPath
XQuery • Możliwość wyszukiwania nie tylko w pojedynczych dokumentach lecz w kolekcjach dokumentów • Kolekcja – zbiór dokumentów XML logicznie ze sobą powiązanych
Wyrażenia XPath w XQuery • Korzeń określony jako collection("/Uczelnia") collection("/Uczelnia")//child::node()[Nazwisko = "Jaworek"] <Pracownik> <Nazwisko>Jaworek</Nazwisko> <PESEL>56022812345</PESEL> <Data_ur>28.02.1956</Data_ur> <Data_przyjecia>01.10.1980</Data_przyjecia> <Dzieci>Brak</Dzieci> <Zespol>Projekt ZEUS</Zespol> </Pracownik> <Student> <Nazwisko>Jaworek</Nazwisko> <PESEL>82022812345</PESEL> <Data_ur>28.02.1982</Data_ur> <Data_przyjecia>01.10.2003</Data_przyjecia> <Wydzial>RAu2</Wydzial> <Kierunek>Informatyka</Kierunek> </Student>
XQuery • Korzeń określony jako document("/Uczelnia/pracownicy.xml") document("/Uczelnia/pracownicy.xml")//Pracownik[ Nazwisko = "Jaworek"] <Pracownik> <Nazwisko>Jaworek</Nazwisko> <PESEL>56022812345</PESEL> <Data_ur>28.02.1956</Data_ur> <Data_przyjecia>01.10.1980</Data_przyjecia> <Dzieci>Brak</Dzieci> <Zespol>Projekt ZEUS</Zespol> </Pracownik>
Konstruktory elementów i atrybutów • Konstruktory bezpośrednie (ang. Direct Constructors) • Konstruktory wyliczane (ang. Computed Constructors)
Konstruktory bezpośrednie Poniższe wyrażenie jest wartościowane do samego siebie <Pracownicy> <Pracownik id="1"> <Nazwisko> Jaworek </Nazwisko> <PESEL> 56022812345 </PESEL> <Data_ur> 28.02.1956 </Data_ur> <Zespol> Projekt ZEUS </Zespol> </Pracownik> </Pracownicy>
Konstruktory wyliczane element Pracownicy { element Pracownik { attribute id { "1" }, element Nazwisko {"Jaworek"}, element PESEL {"56022812345"}, element Data_ur {"28.02.1956"}, element Zespol {"Projekt ZEUS"} } }
Konstruktory wyliczane let $nazw := "Jaworek" let $pesel := "56022812345" let $data := "28.02.1956" return element Pracownicy { element Pracownik { attribute id { "1" }, element Nazwisko {$nazw}, element PESEL {$pesel}, element Data_ur {$data}, element Zespol {"Projekt ZEUS"} }}
Konstruktory – kombinacja let $nazw := "Jaworek" let $pesel := "56022812345" let $data := "28.02.1956" return <Pracownicy> <Pracownik id="1"> <Nazwisko> {$nazw} </Nazwisko> <PESEL> {$pesel} </PESEL> <Data_ur> {$data} </Data_ur> <Zespol> Projekt ZEUS </Zespol> </Pracownik> </Pracownicy>
Konstruktory elementów i atrybutów • W obecnej wersji jest to jedyny sposób na uaktualnianie danych – brak specyfikacji operacji update
Wyrażenie FLWOR • Główne wyrażenie XQuery • FLWOR(„flower”)=For-Let-Where-Order-Return • Odpowiednik występującego w SQL SELECT-FROM-HAVING-WHERE