(XML).
Transkrypt
(XML).
J˛ezyk XML XML (eXtensible Markup Language, czyli rozszerzalny j˛ezyk znaczników) to specyfikacja dotyczaca ˛ przechowywania informacji. Jest to również specyfikacja opisujaca ˛ struktur˛e tych informacji. I XML jest j˛ezykiem znaczników, jak HTML, I XML nie posiada swoich własnych znaczników, I można tworzyć własne znaczniki według potrzeb, I tworzac ˛ nowe znaczniki, należy trzymać si˛e specyfikacji XML-a. J˛ezyk XML XML (eXtensible Markup Language, czyli rozszerzalny j˛ezyk znaczników) to specyfikacja dotyczaca ˛ przechowywania informacji. Jest to również specyfikacja opisujaca ˛ struktur˛e tych informacji. I XML jest j˛ezykiem znaczników, jak HTML, I XML nie posiada swoich własnych znaczników, I można tworzyć własne znaczniki według potrzeb, I tworzac ˛ nowe znaczniki, należy trzymać si˛e specyfikacji XML-a. Literatura uzupełniajaca: ˛ [1] K.H. Goldberg, XML. Szybki start. Wydanie II (Helion, 2014). [2] P. Walmsley, XQuery (O’Reilly Media, Inc., 2007). Przykładowy dokument XML <?xml version="1.0"?> <book> <authors> <author id="47">Włodzimierz Krysicki</author> <author id="58">Lech Włodarski</author> </authors> <title>Analiza matematyczna w zadaniach</title> <price>69.00</price> <keywords> <keyword>pochodna</keyword> <keyword>całka</keyword> </keywords> </book> Przykładowy dokument XML <?xml version="1.0"?> <book> <authors> <author id="47">Włodzimierz Krysicki</author> <author id="58">Lech Włodarski</author> </authors> <title>Analiza matematyczna w zadaniach</title> <price>69.00</price> <keywords> <keyword>pochodna</keyword> <keyword>całka</keyword> </keywords> </book> Wady i zalety XML-a Zalety I I I I Łatwy do odczytania, zarówno dla człowieka, jak dla maszyny (zwykły tekst). Zawiera dane i jednocześnie opisuje znaczenie danych (self-documenting). Może reprezentować praktycznie dowolny rodzaj danych: hierarchie, rekordy, listy (elastyczność, uniwersalność). Sformalizowany zapis pozwala na komputerowe przetworzenie, weryfikacje dokumentów XML (well-formed). Wady I I Nadmiarowość informacji (powtarzajace ˛ si˛e znaczniki, zagnieżdżone elementy). Nie wszystko da si˛e wyrazić elastycznie w postaci struktury hierarchicznej (np. albo Film->Aktor, albo Aktor->Film) Zastosowanie XML-a I Elektroniczna wymiana danych I I I I Usługi e-biznesu: transakcje zakodowane w postaci XML-a (XML jako podstawa Web Serwisów), wiele formatów pochodnych. Komunikacja w sferze publicznej (np. podatnik – urzad ˛ podatkowy, systemy celne, NFZ - świadczeniodawcy, itp.). Do zapisu informacji o luźnej strukturze, trudnej do jednoznacznego opisana w momencie projektowania, np. formularze WWW, wymagajace ˛ cz˛estych zmian. Format przechowywania dokumentów. Zasady pisania dokumentów XML Reguły, aby dokument XML był poprawny składniowo: 1. element główny jest wymagany; zawsze musi być dokładnie jeden element główny; wszystkie pozostałe elementy dokumentu sa˛ zawarte w elemencie głównym; przed elementem głównym dopuszczalne sa˛ komentarze i instrukcje przetwarzania; 2. znaczniki zamykajace ˛ sa˛ niezb˛edne; każdy element musi mieć znacznik zamykajacy; ˛ 3. elementy musza˛ być odpowiednio zagnieżdżone; 4. wielkość liter ma znaczenie; 5. wartość atrybutu musi być zamykana w dwóch takich samych znakach pojedynczego lub podwójnego cudzysłowu. Zasady tworzenia dokumentów XML Elementy składowe XML-a to znaczniki określajace ˛ elementy, wartości tych elementów oraz atrybuty. Element XML to podstawowa jednostka dokumentu. Może zawierać: tekst, atrybuty, inne znaczniki. Każdy element ma znacznik otwierajacy: ˛ <nazwa_elementu> oraz znacznik zamykajacy: ˛ </nazwa_elementu>. Pusty element może składać si˛e z pojedynczego znacznika otwierajacego ˛ i zamykajacego, ˛ np. <obrazek plik="mapa.jpg"/> Atrybuty elementu umieszczane sa˛ w obr˛ebie znacznika otwierajacego, ˛ w postaci par nazwa-wartość, np. <wysokosc jednostka="metr">33</wysokosc>. Opisuja˛ zawartość i przeznaczenie elementu. Informacje zawarte w atrybutach to metadane. Element może mieć wiele atrybutów, ich nazwy musza˛ być unikalne Zasady tworzenia dokumentów XML Dokument XML powinien rozpoczynać si˛e deklaracja,˛ która wskazuje zastosowana˛ wersj˛e XML-a. Przykładowa deklaracja XML: <?xml version="1.0"?> Deklaracj˛e umieszczamy na poczatku, ˛ przed wszystkimi innymi elementami. Znaczniki rozpoczynajace ˛ si˛e od <? i kończace ˛ si˛e ?> to instrukcje przetwarzania. Służa˛ do deklarowania wersji XML, określania kodowania znaków, arkuszy stylów. Zasady tworzenia dokumentów XML Dokument XML powinien rozpoczynać si˛e deklaracja,˛ która wskazuje zastosowana˛ wersj˛e XML-a. Przykładowa deklaracja XML: <?xml version="1.0"?> Deklaracj˛e umieszczamy na poczatku, ˛ przed wszystkimi innymi elementami. Znaczniki rozpoczynajace ˛ si˛e od <? i kończace ˛ si˛e ?> to instrukcje przetwarzania. Służa˛ do deklarowania wersji XML, określania kodowania znaków, arkuszy stylów. Komentarze XML: warto opisywać dokumenty XML, aby określić co oznacza dany element. Komentarz zaczyna si˛e za pomoca˛ <!−−, a kończy −−>. Nie wolno zagnieżdżać komentarzy, ani używać znaku −− wewnatrz ˛ komentarza. Przykładowy dokument XML <?xml version="1.0"?> <book> <authors> <author id="47">Włodzimierz Krysicki</author> <author id="58">Lech Włodarski</author> </authors> <title>Analiza matematyczna w zadaniach</title> <!−−cena ksiażki ˛ na podstawie platformy Ceneo−−> <price>69.00</price> <keywords> <keyword>pochodna</keyword> <keyword>całka</keyword> </keywords> </book> Predefiniowane encje XML-a: pi˛eć znaków specjalnych Predefiniowane encje XML-a: I & tworzy znak & I < tworzy znak < I > tworzy znak > I " tworzy znak ” I ' tworzy znak 0 Przekształcanie dokumentów XML za pomoca˛ XSLT 2.0 J˛ezyk XSLT służy do przekształcanie dokumentów XML na inny format, np. HTML. Przekształcanie dokumentu XML polega na zastosowaniu XSLT do analizy jego zawartości, a nast˛epnie podj˛ecie konkretnych działań w zależności od tego, jakie elementy zostana˛ znalezione. XSLT można użyć także do zmiany kolejności danych wynikowych na podstawie pewnych kryteriów, do wyświetlenia tylko określonych fragmentów informacji. W procesie przekształcania biora˛ udział dwa dokumenty: źródłowy dokument XML oraz arkusz stylów XSLT opisujacy ˛ reguły przekształcania. Arkusze stylów to pliki tekstowe, zapisywane sa˛ z rozszerzeniem .xsl. Każdy arkusz stylów też jest plikiem XML. Do wykonania przekształcenia potrzebujemy: procesora XSLT lub przegladarki, ˛ obsługujacej ˛ XSLT (wi˛ekszość ma wbudowana˛ obsług˛e). 1. Powiazanie ˛ dokumentu XML z arkuszem stylów XSLT 2.0: dodajemy instrukcj˛e (po deklaracji xml): <?xml-stylesheet type="text/xsl" href="booksstyl.xsl"?> 1. Powiazanie ˛ dokumentu XML z arkuszem stylów XSLT 2.0: dodajemy instrukcj˛e (po deklaracji xml): <?xml-stylesheet type="text/xsl" href="booksstyl.xsl"?> 2. Przegladarka ˛ (lub procesor XSLT) nast˛epnie wykona transformacj˛e pliku XML, zanim zostanie on wyświetlony. Pierwszy etap: konwersja dokumentu XML do drzewa w˛ezłów, które jest hierarchiczna˛ reprezentacja.˛ Każdy w˛ezeł odpowiada jednemu z elementów dokumentu XML, atrybutowi lub zawartości tekstowej. 3. Kolejny etap to odwołanie si˛e do arkusza stylów XSLT w celu znalezienia instrukcji, określajacych ˛ sposób wyświetlania w˛ezłów. Instrukcje te sa˛ zawarte w tzw. szablonach, które składaja˛ si˛e z etykiety, która identyfikuje w˛ezły, do których ma zastosowanie dany szablon i z instrukcji określajacych, ˛ jak te w˛ezły maja˛ być przekształcone. Dokument XML i jego drzewo w˛ezłów <?xml version="1.0"?> <books> <book> <authors> <author id="47">Włodzimierz Krysicki</author> <author id="58">Lech Włodarski</author> </authors> <title>Analiza matematyczna w zadaniach</title> <price>69.00</price> <keywords> <keyword>pochodna</keyword> <keyword>całka</keyword> </keywords> </book> </books> Dokument XML i jego drzewo w˛ezłów # # $ % % # # ¹Ó ¹Ó !"" ¹Ó ¹ÓÜ Inicjowanie arkusza stylów XSLT: deklarujemy, że to dokument XML: <?xml version="1.0"?> nast˛epnie deklarujemy przestrzeń nazw XSLT i jej prefiks oraz wersj˛e XSLT <xsl:stylesheet xmlns:xsl="http://www.w3.org/ 1999/XSL/Transform" version="2.0"> określamy typ pliku wynikowego (html): <xsl:output method="html"/> tworzymy szablon główny: <xsl:template match="/"> w szablonie głównym określamy poszczególne elementy dokumentu HTML Zamykamy szablon główny: </xsl:template> i kończymy arkusz stylów: </xsl:stylesheet> Tworzenie szablonu głównego: <xsl:template match="/"> Szablon główny określa reguły stosowane do w˛ezła głównego dokumentu XML. Opisuje sposób przetwarzania zawartości z w˛ezła głównego w nowe dane wynikowe. Aby utworzyć plik wyjściowy w formacie html, należy zastosować instrukcj˛e: <xsl:output method="html"/> W obr˛ebie szablonu głównego należy teraz określić poszczególne elementy dokumentu HTML (head, title, body, itp.). Wszystko w obr˛ebie szablonu głównego, co nie jest instrukcja˛ XSLT (czyli elementy literalne), b˛edzie wyświetlane w takiej formie, w jakiej zostało zapisane. W ten sposób można dodać znaczniki i tekst html do pliku wynikowego. Wyświetlanie wartości w˛ezła Aby wyświetlić wartość w˛ezła XML, używamy instrukcji <xsl:value-of>: <xsl:value-of select="wyrażenie"/> Wyrażenie XPath identyfikuje zbiór w˛ezłów, który ma być wyświetlany. Uwagi I instrukcja select="." służy do wybrania bieżacego ˛ w˛ezła. I Jeżeli wyrażenie select odpowiada wi˛ecej, niż jednemu w˛ezłowi, wyświetlana jest zawartość pierwszego w˛ezła. I Można zwrócić tylko te w˛ezły, dla których określony atrybut ma dana˛ wartość, np.: select="books/book[@language=’polski’]" I Jeżeli wyrażenie select odpowiada w˛ezłowi, który posiada w˛ezły potomne, ich zawartość też jest wyświetlana. I Jeżeli odpowiada pustemu zbiorowi w˛ezłów - nic nie jest wyświetlane. Zap˛etlanie w˛ezłów Element xsl:for-each pozwala działać na wszystkich w˛ezłach, do których pasuje. Aby przetwarzać w˛ezły partiami, należy: I w obr˛ebie reguły szablony wpisujemy <xsl:for-each select="wyrażenie"> I podajemy reguły przetwarzania w˛ezłów, które maja˛ być przetworzone (identyfikuje je wyrażenie XPath) I kończymy instrukcj˛e znacznikiem </xsl:for-each> Uwagi I znacznik xsl:for-each powinno si˛e umieszczać przed regułami, które maja˛ być powtarzane dla każdego znalezionego w˛ezła I jeżeli chcemy umieścić zawartość w˛ezłów w tabeli, znacznik <table> otwierajacy ˛ tabel˛e powinien być przed instrukcja˛ <xsl:for-each>, a znacznik zamykajacy ˛ tabel˛e po niej. J˛ezyk XPath XPath jest j˛ezykiem służacym ˛ do wybierania w˛ezłów i zbioru w˛ezłów poprzez określanie ścieżek ich lokalizacji w dokumencie XML. XPath można też użyć do dalszego przetworzenia zbioru zwróconych w˛ezłów, za pomoca˛ wbudowanych funkcji do obliczeń matematycznych, przetwarzania ciagów ˛ znaków i testowania warunków w dokumencie XML. U podstaw j˛ezyka XPath leży możliwość stosowania ścieżek lokalizacji, w celu odwołania si˛e do w˛ezłów dokumentu XML (w˛ezeł to każdy indywidualny fragment dokumentu XML: element, atrybut, zawartość tekstowa). XPath widzi dokument XML w postaci drzewa w˛ezłów. Dokument XML i jego drzewo w˛ezłów <?xml version="1.0"?> <books> <book> <authors> <author id="47">Włodzimierz Krysicki</author> <author id="58">Lech Włodarski</author> </authors> <title>Analiza matematyczna w zadaniach</title> <price>69.00</price> <keywords> <keyword>pochodna</keyword> <keyword>całka</keyword> </keywords> </book> </books> Dokument XML i jego drzewo w˛ezłów # # $ % % # # ¹Ó ¹Ó !"" ¹Ó ¹ÓÜ Ścieżki lokalizacji Dwa rodzaje ścieżek lokalizacji: wzgl˛edna ścieżka: składa si˛e z sekwencji kroków lokalizacji, rozdzielonych znakiem /. Każdy krok określa w˛ezeł (lub zbiór w˛ezłów) wzgl. w˛ezła bieżacego. ˛ W kolejnym kroku każdy w˛ezeł w tym zbiorze jest użyty w roli w˛ezła bieżacego ˛ dla kolejnego kroku; bezwgl˛edna ścieżka: zaczyna si˛e od znaku /, po którym może nast˛epować wzgl˛edna ścieżka lokalizacji. Znak / określa w˛ezeł główny. W˛ezeł bieżacy ˛ to element lub w˛ezeł, który jest aktualnie przetwarzany. Wyrażenia XPath Wybieranie dzieci danego w˛ezła: jeżeli bieżacy ˛ w˛ezeł zawiera elementy, które chcemy znaleźć, należy podać nazw˛e elementu - dziecka, aby odwołać si˛e do dalszych potomków, należy użyć znaku / i podać nazw˛e dalszego potomka, itp. Znak * określa wszystkie dzieci bieżacego ˛ w˛ezła, np. /book/authors/author /book/title Wybieranie rodzica danego w˛ezła: za pomoca˛ .. Można potem odwołać si˛e do innych dzieci w˛ezła, b˛edacego ˛ tym rodzicem, np. ../title spowoduje wybranie w˛ezła - dziecka (o nazwie title) dla w˛ezła b˛edacego ˛ rodzicem w˛ezła bieżacego; ˛ ../* to wybranie wszystkich elementów-dzieci rodzica w˛ezła bieżacego. ˛ Wybieranie atrybutów w˛ezła: stosujemy znak @. Wpisz ścieżk˛e lokalizacji dla danego w˛ezła, nast˛epnie /@nazwa atrybutu, np. /book/authors/author[@id=100] Wyrażenia XPath Wybieranie wszystkich potomków: skrót // Aby wybrać wszystkich potomków w˛ezła głównego użyj // Aby wybrać pewnych potomków danego w˛ezła użyj ścieżka lokalizacji do w˛ezła//nazwa elementu, który nas interesuje. Aby wybrać wszystkie w˛ezły o danej nazwie, bez wzgl˛edu na ich położenie w dokumencie XML, użyj //nazwa elementu. Warunkowe wybieranie w˛ezłów: w XPath można tworzyć wyrażenia logiczne (tzw. predykaty), do testowania warunków, na podstawie których można wybrac tylko pewien podzbiór ze znalezionego zbioru w˛ezłów. Podajemy je w nawiasach kwadratowych, np. /book/authors/author[@id=200] Wybranie tylko wartości tekstowej elementu: funkcja text(), np. /book/authors/author/text() J˛ezyk XQuery J˛ezyk XQuery 1.0 jest wykorzystywany do selekcji zawartości z danych źródłowych XML, przekształcania jej wg określonych reguł, a nast˛epnie zwracania w postaci np. pliku XML, HTML lub innej. XQuery stosuje składni˛e j˛ezyka XPath 2.0 do wybierania zawartości źródłowej XML i modyfikacji tej zawartości w razie potrzeby. Wyrażenia FLWOR Wyrażenie FLWOR zawiera nast˛epujace ˛ klauzule (od poczatkowych ˛ liter klauzul powstała nazwa wyrażenia:) F: for (dokonuje iteracji wia˛żac ˛ zmienna˛ z elementem) L: let (wia˛że zmienna˛ z sekwencja) ˛ W: where (eliminuje elementy do iteracji) O: order by (porzadkuje ˛ elementy do iteracji) R: return (buduje wynik zapytania) xquery for $cust in db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo let $tel :=$cust/phone where $tel/@type=’work’ order by $cust return ($cust/name/text(), $tel); XML w relacyjnych bazach danych I Model XML jest modelem hierarchicznym, natomiast dane relacyjne maja˛ płaska˛ struktur˛e. I Dane XML opisuja˛ swoje znaczenie, a dane relacyjne nie. I Dane XML maja˛ określona˛ kolejność, a dane relacyjne nie. Konwersja z formatu XML na relacyjny jest kłopotliwa, w druga˛ stron˛e nieco łatwiejsza. XML w relacyjnych bazach danych Dane XML można przechowywać w relacyjnej bazie danych na kilka sposobów: I całe dokumenty XML, jako duże obiekty (CLOB / BLOB) duża elastyczność w przechowywaniu dokumentów XML o różnej strukturze, kosztem wydajności zapytań. I I I I Szybkie wstawianie oraz pobieranie całych dokumentów Swoboda definiowania struktury dokumentu (schematu) Koniecznosc parsowania dokumentu w momencie realizowania zapytan przy odwołaniu do elementów nie poindeksowanych (niska wydajność zapytań) rozbite na kilka tabel bazy (mimo stosunkowo dobrej wydajnosci wyszukiwania, tracimy to co motywuje do korzystania z formatu XML – elastyczność). I I Stosunkowo szybkie wyszukiwanie, nawet mimo konwersji XQuery na SQL Konieczność definiowania struktury (schematu) dokumentu przed wstawieniem - problem ze zmiana˛ schematu XML w DB2: Technologia PureXML Dokument jest wstawiany do pola o typie XML, w tle wezły dokumentu sa˛ dekomponowane do hierarchicznej postaci (do drzewa w˛ezłów). I Duża elastyczność, brak wymogu wcześniejszego definiowania schematu I Szybkie wyszukiwanie, bez koniecznosci dynamicznego parsowania I Spowolnione przy wstawianiu dokumentu. Hybrydowa architektura serwera DB2 pozwala zachować elastyczność formatu XML przy zachowaniu odpowiedniej wydajności. XML w DB2 Dost˛ep do danych XML: j˛ezyki SQL/XML oraz XQuery. Obsługa XML wbudowana w DB2: Wysoka wydajność dzi˛eki gł˛ebokiej integracji XML w silnik DB2. Zoptymalizowane przechowywanie XML: Nowy sposób składowania oraz indeksowania dokumentów XML – silnik hierarchiczny. Zapytania na danych XML Istnieja˛ dwa sposoby konstruowania zapytań XML w DB2: (1) przy użyciu XQuery: XQuery jako j˛ezyk podstawowy. (2) Przy użyciu SQL z rozszerzeniami XML (SQL/XML): SQL jako j˛ezyk podstawowy, umożliwia złaczenie ˛ danych XML z relacyjnymi. Odpytywanie danych XML za pomoca˛ XQuery XQuery jest użyty jako j˛ezyk podstawowy, można używać SQL osadzonego wewnatrz ˛ XQuery (za pomoca˛ funkcji db2-fn: sqlquery lub db2-fn:xmlcolumn). Odpytywanie danych XML za pomoca˛ XQuery XQuery jest użyty jako j˛ezyk podstawowy, można używać SQL osadzonego wewnatrz ˛ XQuery (za pomoca˛ funkcji db2-fn: sqlquery lub db2-fn:xmlcolumn). Przykład: xquery db2-fn:xmlcolumn("CUSTOMER.INFO"); Wyrażenia XQuery zawsze poprzedzamy prefiksem xquery, aby DB2 wiedział, że należy użyć parsera XQuery. Odpytywanie danych XML za pomoca˛ XQuery XQuery jest użyty jako j˛ezyk podstawowy, można używać SQL osadzonego wewnatrz ˛ XQuery (za pomoca˛ funkcji db2-fn: sqlquery lub db2-fn:xmlcolumn). Przykład: xquery db2-fn:xmlcolumn("CUSTOMER.INFO"); Wyrażenia XQuery zawsze poprzedzamy prefiksem xquery, aby DB2 wiedział, że należy użyć parsera XQuery. Funkcja db2-fn:xmlcolumn: zwraca dokumenty XML z kolumny podanej w parametrze. Powyższe zapytanie odpowiada wyrażeniu SQL: SELECT contact FROM clients Odpytywanie danych XML za pomoca˛ XQuery XQuery jest użyty jako j˛ezyk podstawowy, można używać SQL osadzonego wewnatrz ˛ XQuery (za pomoca˛ funkcji db2-fn: sqlquery lub db2-fn:xmlcolumn). Przykład: xquery db2-fn:xmlcolumn("CUSTOMER.INFO"); Wyrażenia XQuery zawsze poprzedzamy prefiksem xquery, aby DB2 wiedział, że należy użyć parsera XQuery. Funkcja db2-fn:xmlcolumn: zwraca dokumenty XML z kolumny podanej w parametrze. Powyższe zapytanie odpowiada wyrażeniu SQL: SELECT contact FROM clients Przy funkcji db2-fn:xmlcolumn można podać wyrażenie XPath, aby wybrać dane XML w odpowiedni sposób. Przykładowe zapytania xquery db2-fn:xmlcolumn("CUSTOMER.INFO")/ customerinfo/ name/text(); xquery db2-fn:xmlcolumn("CUSTOMER.INFO")/ customerinfo[@Cid >= 1001]/name; xquery db2-fn:xmlcolumn("CUSTOMER.INFO")/ customerinfo/count(phone); xquery db2-fn:xmlcolumn("CUSTOMER.INFO")/ customerinfo/ (<dane> {name/text(), ’ liczba nr tel: ’, count(phone)}</dane>); Odpytywanie danych XML za pomoca˛ XQuery Przykład - użycie wyrażenia FLWOR z funkcja˛ db2-fn:xmlcolumn: xquery for $y in db2-fn:xmlcolumn(‘CLIENTS.CONTACT’)/Client/fax return $y Odpytywanie danych XML za pomoca˛ XQuery Funkcja db2-fn:sqlquery wykonuje zapytanie SQL i zwraca tylko wybrane dane XML. Zapytania SQL przekazane do db2-fn:sqlquery musza˛ zwracać tylko dane XML. Te dane XML moga˛ być nast˛epnie przetwarzane przez XQuery. Odpytywanie danych XML za pomoca˛ XQuery Funkcja db2-fn:sqlquery wykonuje zapytanie SQL i zwraca tylko wybrane dane XML. Zapytania SQL przekazane do db2-fn:sqlquery musza˛ zwracać tylko dane XML. Te dane XML moga˛ być nast˛epnie przetwarzane przez XQuery. xquery for $cust in db2-fn:sqlquery( "SELECT info FROM customer WHERE cid = 1005" )/customerinfo let $phone :=$cust/phone return (<info> {$cust/name/text(), $phone} </info>); Odpytywanie danych XML za pomoca˛ SQL/XML Zapytanie SQL może być wykorzystane do pracy z całymi dokumentami XML, ale nie pozwala na dost˛ep jedynie do wybranych fragmentów dokumentu. W takiej sytuacji można wykorzystać rozszerzenie SQL - SQL/XML. Odpytywanie danych XML za pomoca˛ SQL/XML Zapytanie SQL może być wykorzystane do pracy z całymi dokumentami XML, ale nie pozwala na dost˛ep jedynie do wybranych fragmentów dokumentu. W takiej sytuacji można wykorzystać rozszerzenie SQL - SQL/XML. Podstawowe funkcje SQL/XML (zgodnie ze standardem SQL 2006): Nazwa funkcji Opis XMLPARSE Analizuje ciag ˛ znaków lub obiekt binarny zwraca dokument XML XMLSERIALIZE Tłumaczy dokument XML na ciag ˛ znaków lub obiekt binarny XMLVALIDATE Waliduje dokument XML według schematu XMLEXISTS Określa, czy polecenie XQuery zwraca wynik XMLQUERY Wykonuje polecenie XQuery XMLTABLE Wykonuje polecenie XQuery zwraca wynik w postaci tabeli relacyjnej XMLCAST Rzutuje z lub na dokument XML Funkcja XMLQUERY Funkcja XMLQUERY - umożliwia wykonanie wyrażenia XQuery z poziomu SQL; zwraca wyrażenie XML - sekwencj˛e XML, b˛edac ˛ a˛ wynikiem wyrażenia XQuery dla każdego wiersza zapytania SQL; zwracana sekwencja może zawierać wiele elementów, lub być pusta. Funkcja XMLQUERY Funkcja XMLQUERY - umożliwia wykonanie wyrażenia XQuery z poziomu SQL; zwraca wyrażenie XML - sekwencj˛e XML, b˛edac ˛ a˛ wynikiem wyrażenia XQuery dla każdego wiersza zapytania SQL; zwracana sekwencja może zawierać wiele elementów, lub być pusta. Wykorzystujac ˛ XMLQUERY: mamy możliwość wykonywania zapytań na danych XML; dane XML moga˛ być użyte w obr˛ebie zapytania SQL; dost˛ep jednocześnie do danych relacyjnych i XML; dane XML zwrócone przez XQUERY można nast˛epnie wykorzystać w zapytaniu SQL, aby np. uporzadkować ˛ wynik (należy je najpierw zrzutować na odpowiedni relacyjny typ danych za pomoca˛ XMLCAST). XMLQUERY SELECT XMLQuery(’$i/customerinfo/name’ PASSING INFO as "i") FROM customer where CID IN (1003,1001,1004); W tym zapytaniu XQuery, zmienna $i zawiera dokument XML zapisany w tabeli customer w kolumnie INFO (typu XML). Przypisanie dokumentu do zmiennej nast˛epuje w klauzuli PASSING INFO as "i" (można zwiazać ˛ wi˛ecej niż jedna˛ zmienna). ˛ Wyrażenie XPath wykorzystane w funkcji wskazuje na element name w dokumencie XML. XMLQUERY SELECT XMLQuery(’$i/customerinfo/name’ PASSING INFO as "i") FROM customer where CID IN (1003,1001,1004); W tym zapytaniu XQuery, zmienna $i zawiera dokument XML zapisany w tabeli customer w kolumnie INFO (typu XML). Przypisanie dokumentu do zmiennej nast˛epuje w klauzuli PASSING INFO as "i" (można zwiazać ˛ wi˛ecej niż jedna˛ zmienna). ˛ Wyrażenie XPath wykorzystane w funkcji wskazuje na element name w dokumencie XML. Wynik: <name>Kathy Smith</name> <name>Robert Shoemaker</name> <name>Matt Foreman</name> W funkcji XMLQUERY można użyć także wyrażenia FLWOR XQuery, np. SELECT XMLQuery(’for $c in $i/customerinfo let $p := $c/phone return ($c/name, $p)’ PASSING INFO as "i") as dane FROM customer where CID =1004; W funkcji XMLQUERY można użyć także wyrażenia FLWOR XQuery, np. SELECT XMLQuery(’for $c in $i/customerinfo let $p := $c/phone return ($c/name, $p)’ PASSING INFO as "i") as dane FROM customer where CID =1004; Wynik (tylko jeden wiersz): DANE --------------------------------------------------------------------<name>Matt Foreman</name><phone type="work">905-555-4789</phone> <phone type="home">416-555-3376</phone> Funkcja XMLTable Funkcj˛e XMLTable można wykorzystać, jeżeli chcemy prezentować dane XML w postaci tabeli, np. select c.cid, cinfo.name,cinfo.city, cinfo.phone, cinfo.type from customer c, xmltable(’$cust/customerinfo’ passing c.info as "cust" columns name char(30) path ’name’, city char(12) path ’addr/city’, phone char(12) path ’phone[1]’, type char(6) path ’phone[1]/@type’ ) cinfo; Wynik poprzedniego zapytania: CID --1000 1001 1002 1003 1004 1005 NAME --------------Kathy Smith Kathy Smith Jim Noodle Robert Shoemaker Matt Foreman Larry Menard CITY -------Toronto Markham Markham Aurora Toronto Toronto PHONE -------416-555-1358 905-555-7258 905-555-7258 905-555-7258 905-555-4789 905-555-9146 TYPE ---work work work work work work XMLTable z wykorzystaniem wyrażenia FOR w XPath select c.cid, cinfo.name,cinfo.city, cinfo.phone, cinfo.type from customer c, xmltable(’$cust/customerinfo’ passing c.info as "cust" columns name char(30) path ’name’, city char(12) path ’addr/city’, phone char(12) path ’for $p in phone return $p’, ) cinfo; XMLExists Funkcja XMLExists może być wykorzystana w klauzuli WHERE zapytania SQL, aby sprawdzić, czy zapytanie XQuery zwraca wyniki, np. select cid, xmlquery(’$INFO/customerinfo/name/text()’) from customer where xmlexists(’$INFO/customerinfo/phone[@type="home"]’); XMLExists Funkcja XMLExists może być wykorzystana w klauzuli WHERE zapytania SQL, aby sprawdzić, czy zapytanie XQuery zwraca wyniki, np. select cid, xmlquery(’$INFO/customerinfo/name/text()’) from customer where xmlexists(’$INFO/customerinfo/phone[@type="home"]’); Powyższe zapytanie zwróci informacje tylko o tych klientach, którzy podali domowy numer telefonu. Uwaga. w funkcjach XMLQuery i XMLExists w przykładzie wykorzystano uproszczona˛ składni˛e.