Język XML XML (extensible Markup Language, czyli rozszerzalny język znaczników) to specyfikacja dotycząca przechowywania informacji. Jest to również specyfikacja opisujaca strukturę tych informacji. XML jest językiem znaczników, jak HTML, XML nie posiada swoich własnych znaczników, można tworzyć własne znaczniki według potrzeb, tworząc nowe znaczniki, należy trzymać się specyfikacji XML-a.
Język XML XML (extensible Markup Language, czyli rozszerzalny język znaczników) to specyfikacja dotycząca przechowywania informacji. Jest to również specyfikacja opisujaca strukturę tych informacji. XML jest językiem znaczników, jak HTML, XML nie posiada swoich własnych znaczników, można tworzyć własne znaczniki według potrzeb, tworząc nowe znaczniki, należy trzymać się specyfikacji XML-a. Literatura uzupełniająca: [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 Ł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 Nadmiarowość informacji (powtarzające się znaczniki, zagnieżdżone elementy). Nie wszystko da się wyrazić elastycznie w postaci struktury hierarchicznej (np. albo Film->Aktor, albo Aktor->Film)
Zastosowanie XML-a Elektroniczna wymiana danych 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 urząd podatkowy, systemy celne, NFZ - świadczeniodawcy, itp.). Do zapisu informacji o luźnej strukturze, trudnej do jednoznacznego opisana w momencie projektowania, np. formularze WWW, wymagające częstych 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 są zawarte w elemencie głównym; przed elementem głównym dopuszczalne są komentarze i instrukcje przetwarzania; 2. znaczniki zamykajace są niezbędne; każdy element musi mieć znacznik zamykający; 3. elementy muszą 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ślające 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 otwierający: <nazwa_elementu> oraz znacznik zamykający: </nazwa_elementu>. Pusty element może składać się z pojedynczego znacznika otwierającego i zamykającego, np. <obrazek plik="mapa.jpg"/> Atrybuty elementu umieszczane są w obrębie znacznika otwierającego, w postaci par nazwa-wartość, np. <wysokosc jednostka="metr">33</wysokosc>. Opisują zawartość i przeznaczenie elementu. Informacje zawarte w atrybutach to metadane. Element może mieć wiele atrybutów, ich nazwy muszą być unikalne
Zasady tworzenia dokumentów XML Dokument XML powinien rozpoczynać się deklaracją, która wskazuje zastosowaną wersję XML-a. Przykładowa deklaracja XML: <?xml version="1.0"?> Deklarację umieszczamy na początku, przed wszystkimi innymi elementami. Znaczniki rozpoczynające się od <? i kończące się?> to instrukcje przetwarzania. Służą do deklarowania wersji XML, określania kodowania znaków, arkuszy stylów.
Zasady tworzenia dokumentów XML Dokument XML powinien rozpoczynać się deklaracją, która wskazuje zastosowaną wersję XML-a. Przykładowa deklaracja XML: <?xml version="1.0"?> Deklarację umieszczamy na początku, przed wszystkimi innymi elementami. Znaczniki rozpoczynające się od <? i kończące się?> to instrukcje przetwarzania. Służą 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ę za pomocą <!, a kończy >. Nie wolno zagnieżdżać komentarzy, ani używać znaku wewnątrz 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ęć znaków specjalnych Predefiniowane encje XML-a: & tworzy znak & < tworzy znak < > tworzy znak > " tworzy znak ' tworzy znak
Przekształcanie dokumentów XML za pomoca XSLT 2.0 Język 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ępnie podjęcie konkretnych działań w zależności od tego, jakie elementy zostaną 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 biorą udział dwa dokumenty: źródłowy dokument XML oraz arkusz stylów XSLT opisujący reguły przekształcania. Arkusze stylów to pliki tekstowe, zapisywane są z rozszerzeniem.xsl. Każdy arkusz stylów też jest plikiem XML. Do wykonania przekształcenia potrzebujemy: procesora XSLT lub przeglądarki, obsługującej XSLT (większość ma wbudowaną obsługę).
1. Powiązanie dokumentu XML z arkuszem stylów XSLT 2.0: dodajemy instrukcję (po deklaracji xml): <?xml-stylesheet type="text/xsl" href="booksstyl.xsl"?>
1. Powiązanie dokumentu XML z arkuszem stylów XSLT 2.0: dodajemy instrukcję (po deklaracji xml): <?xml-stylesheet type="text/xsl" href="booksstyl.xsl"?> 2. Przeglądarka (lub procesor XSLT) następnie wykona transformację pliku XML, zanim zostanie on wyświetlony. Pierwszy etap: konwersja dokumentu XML do drzewa węzłów, które jest hierarchiczną reprezentacją. Każdy węzeł odpowiada jednemu z elementów dokumentu XML, atrybutowi lub zawartości tekstowej. 3. Kolejny etap to odwołanie się do arkusza stylów XSLT w celu znalezienia instrukcji, określających sposób wyświetlania węzłów. Instrukcje te są zawarte w tzw. szablonach, które składają się z etykiety, która identyfikuje węzły, do których ma zastosowanie dany szablon i z instrukcji określających, jak te węzły mają być przekształcone.
Dokument XML i jego drzewo węzłó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ęzłów!"" #$% #% # #
Inicjowanie arkusza stylów XSLT: deklarujemy, że to dokument XML: <?xml version="1.0"?> następnie deklarujemy przestrzeń nazw XSLT i jej prefiks oraz wersję 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ęzła głównego dokumentu XML. Opisuje sposób przetwarzania zawartości z węzła głównego w nowe dane wynikowe. Aby utworzyć plik wyjściowy w formacie html, należy zastosować instrukcję: <xsl:output method="html"/> W obrębie szablonu głównego należy teraz określić poszczególne elementy dokumentu HTML (head, title, body, itp.). Wszystko w obrębie szablonu głównego, co nie jest instrukcją XSLT (czyli elementy literalne), będzie 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ęzła Aby wyświetlić wartość węzła XML, używamy instrukcji <xsl:value-of>: <xsl:value-of select="wyrażenie"/> Wyrażenie XPath identyfikuje zbiór węzłów, który ma być wyświetlany. Uwagi instrukcja select="." służy do wybrania bieżącego węzła. Jeżeli wyrażenie select odpowiada więcej, niż jednemu węzłowi, wyświetlana jest zawartość pierwszego węzła. Można zwrócić tylko te węzły, dla których określony atrybut ma daną wartość, np.: select="books/book[@language= polski ]" Jeżeli wyrażenie select odpowiada węzłowi, który posiada węzły potomne, ich zawartość też jest wyświetlana. Jeżeli odpowiada pustemu zbiorowi węzłów - nic nie jest wyświetlane.
Zapętlanie węzłów Element xsl:for-each pozwala działać na wszystkich węzłach, do których pasuje. Aby przetwarzać węzły partiami, należy: w obrębie reguły szablony wpisujemy <xsl:for-each select="wyrażenie"> podajemy reguły przetwarzania węzłów, które mają być przetworzone (identyfikuje je wyrażenie XPath) kończymy instrukcję znacznikiem </xsl:for-each> Uwagi znacznik xsl:for-each powinno się umieszczać przed regułami, które mają być powtarzane dla każdego znalezionego węzła jeżeli chcemy umieścić zawartość węzłów w tabeli, znacznik <table> otwierający tabelę powinien być przed instrukcją <xsl:for-each>, a znacznik zamykający tabelę po niej.
Język XPath XPath jest językiem służącym do wybierania węzłów i zbioru węzłów poprzez określanie ścieżek ich lokalizacji w dokumencie XML. XPath można też użyć do dalszego przetworzenia zbioru zwróconych węzłów, za pomocą wbudowanych funkcji do obliczeń matematycznych, przetwarzania ciągów znaków i testowania warunków w dokumencie XML. U podstaw języka XPath leży możliwość stosowania ścieżek lokalizacji, w celu odwołania się do węzłów dokumentu XML (węzeł to każdy indywidualny fragment dokumentu XML: element, atrybut, zawartość tekstowa). XPath widzi dokument XML w postaci drzewa węzłów.
Dokument XML i jego drzewo węzłó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ęzłów!"" #$% #% # #
Ścieżki lokalizacji Dwa rodzaje ścieżek lokalizacji: względna ścieżka: składa się z sekwencji kroków lokalizacji, rozdzielonych znakiem /. Każdy krok określa węzeł (lub zbiór węzłów) wzgl. węzła bieżącego. W kolejnym kroku każdy węzeł w tym zbiorze jest użyty w roli węzła bieżącego dla kolejnego kroku; bezwględna ścieżka: zaczyna się od znaku /, po którym może następować względna ścieżka lokalizacji. Znak / określa węzeł główny. Węzeł bieżący to element lub węzeł, który jest aktualnie przetwarzany.
Wyrażenia XPath Wybieranie dzieci danego węzła: jeżeli bieżący węzeł zawiera elementy, które chcemy znaleźć, należy podać nazwę elementu - dziecka, aby odwołać się do dalszych potomków, należy użyć znaku / i podać nazwę dalszego potomka, itp. Znak * określa wszystkie dzieci bieżącego węzła, np. /book/authors/author /book/title Wybieranie rodzica danego węzła: za pomocą.. Można potem odwołać się do innych dzieci węzła, będącego tym rodzicem, np.../title spowoduje wybranie węzła - dziecka (o nazwie title) dla węzła będącego rodzicem węzła bieżącego;../* to wybranie wszystkich elementów-dzieci rodzica węzła bieżącego. Wybieranie atrybutów węzła: stosujemy znak @. Wpisz ścieżkę lokalizacji dla danego węzła, następnie /@nazwa atrybutu, np. /book/authors/author[@id=100]
Wyrażenia XPath Wybieranie wszystkich potomków: skrót // Aby wybrać wszystkich potomków węzła głównego użyj // Aby wybrać pewnych potomków danego węzła użyj ścieżka lokalizacji do węzła//nazwa elementu, który nas interesuje. Aby wybrać wszystkie węzły o danej nazwie, bez względu na ich położenie w dokumencie XML, użyj //nazwa elementu. Warunkowe wybieranie węzłó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ęzłó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ęzyk XQuery Język XQuery 1.0 jest wykorzystywany do selekcji zawartości z danych źródłowych XML, przekształcania jej wg określonych reguł, a następnie zwracania w postaci np. pliku XML, HTML lub innej. XQuery stosuje składnię języka 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ępujące klauzule (od początkowych liter klauzul powstała nazwa wyrażenia:) F: for (dokonuje iteracji wiążąc zmienną z elementem) L: let (wiąże zmienną z sekwencją) W: where (eliminuje elementy do iteracji) O: order by (porządkuje 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 Model XML jest modelem hierarchicznym, natomiast dane relacyjne mają płaską strukturę. Dane XML opisują swoje znaczenie, a dane relacyjne nie. Dane XML mają określoną kolejność, a dane relacyjne nie. Konwersja z formatu XML na relacyjny jest kłopotliwa, w drugą stronę nieco łatwiejsza.
XML w relacyjnych bazach danych Dane XML można przechowywać w relacyjnej bazie danych na kilka sposobów: 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ń. 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ść). Stosunkowo szybkie wyszukiwanie, nawet mimo konwersji XQuery na SQL Konieczność definiowania struktury (schematu) dokumentu przed wstawieniem - problem ze zmianą schematu
XML w DB2: Technologia PureXML Dokument jest wstawiany do pola o typie XML, w tle wezły dokumentu są dekomponowane do hierarchicznej postaci (do drzewa węzłów). Duża elastyczność, brak wymogu wcześniejszego definiowania schematu Szybkie wyszukiwanie, bez koniecznosci dynamicznego parsowania Spowolnione przy wstawianiu dokumentu. Hybrydowa architektura serwera DB2 pozwala zachować elastyczność formatu XML przy zachowaniu odpowiedniej wydajności.
XML w DB2 Dostęp do danych XML: języki SQL/XML oraz XQuery. Obsługa XML wbudowana w DB2: Wysoka wydajność dzięki głębokiej integracji XML w silnik DB2. Zoptymalizowane przechowywanie XML: Nowy sposób składowania oraz indeksowania dokumentów XML silnik hierarchiczny.
Zapytania na danych XML Istnieją dwa sposoby konstruowania zapytań XML w DB2: (1) przy użyciu XQuery: XQuery jako język podstawowy. (2) Przy użyciu SQL z rozszerzeniami XML (SQL/XML): SQL jako język podstawowy, umożliwia złączenie danych XML z relacyjnymi.
Odpytywanie danych XML za pomoca XQuery XQuery jest użyty jako język podstawowy, można używać SQL osadzonego wewnątrz XQuery (za pomocą funkcji db2-fn: sqlquery lub db2-fn:xmlcolumn).
Odpytywanie danych XML za pomoca XQuery XQuery jest użyty jako język podstawowy, można używać SQL osadzonego wewnątrz XQuery (za pomocą 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ęzyk podstawowy, można używać SQL osadzonego wewnątrz XQuery (za pomocą 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ęzyk podstawowy, można używać SQL osadzonego wewnątrz XQuery (za pomocą 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 funkcją 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 muszą zwracać tylko dane XML. Te dane XML mogą być następnie 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 muszą zwracać tylko dane XML. Te dane XML mogą być następnie 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ęp 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ęp 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 ciąg znaków lub obiekt binarny zwraca dokument XML XMLSERIALIZE Tłumaczy dokument XML na ciąg 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ę XML, będącą 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ę XML, będącą wynikiem wyrażenia XQuery dla każdego wiersza zapytania SQL; zwracana sekwencja może zawierać wiele elementów, lub być pusta. Wykorzystując XMLQUERY: mamy możliwość wykonywania zapytań na danych XML; dane XML mogą być użyte w obrębie zapytania SQL; dostęp jednocześnie do danych relacyjnych i XML; dane XML zwrócone przez XQUERY można następnie wykorzystać w zapytaniu SQL, aby np. uporządkować wynik (należy je najpierw zrzutować na odpowiedni relacyjny typ danych za pomocą 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ępuje w klauzuli PASSING INFO as "i" (można związać więcej niż jedną zmienną). 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ępuje w klauzuli PASSING INFO as "i" (można związać więcej niż jedną zmienną). 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ę 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 NAME CITY PHONE TYPE --- --------------- -------- -------- ---- 1000 Kathy Smith Toronto 416-555-1358 work 1001 Kathy Smith Markham 905-555-7258 work 1002 Jim Noodle Markham 905-555-7258 work 1003 Robert Shoemaker Aurora 905-555-7258 work 1004 Matt Foreman Toronto 905-555-4789 work 1005 Larry Menard Toronto 905-555-9146 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 uproszczoną składnię.
Przykład bazy z wykorzystaniem XML Schemat bazy danych:
Przykład bazy z wykorzystaniem XML Przykładowy dokument XML z kolumny author.info
Przykład bazy z wykorzystaniem XML Przykładowy dokument XML z kolumny edition.translations
Dodawanie danych XML do tabel Dodawanie dokumentów XML do bazy danych DB2 może zostać wykonane za pomocą polecenia INSERT języka SQL, albo polecenia IMPORT. (1) Dodawanie nowego wiersza do tabeli author za pomocą INSERT (w poleceniu INSERT przekazujemy dokument XML jako ciąg znaków zawarty w cudzysłowie): INSERT INTO author VALUES (DEFAULT, Joanne Rowling, <Info> <Email>jr@jr.com</Email> <Country>England</Country> <YearOfBirth>1965</YearOfBirth> </Info> );
Dodawanie danych XML do tabel Dodawanie dokumentów XML do bazy danych DB2 może zostać wykonane za pomocą polecenia INSERT języka SQL, albo polecenia IMPORT. (2) Ładowanie (wielu) wierszy do tabeli author za pomocą polecenia IMPORT (importujemy dane z pliku authors.del (plik ASCII z separatorami), dodatkowo wskazujemy lokalizację dokumentu XML, do którego odnosi się authors.del): IMPORT FROM "C:\xml\authors.del" OF DEL XML FROM "C:\xml\xxx" METHOD P ( 1, 2 ) INSERT INTO ANIAF.AUTHOR ( NAME, INFO ); W pliku authors.del mamy zapisane dwa wiersze danych: "Joanna Chmielewska","<XDS FIL= a1.01.xml />" "Frank Herbert","<XDS FIL= a1.02.xml />" W pliku authors.del, instrukcja XDS FIL= dokumentu XML. służy do wskazania
Operacje aktualizacji i usuwania Operacje aktualizacji (UPDATE) i usuwania (DELETE) w dokumentach XML mogą być wykonane na dwa sposoby: (1) Użycie operacji SQL: UPDATE, DELETE (2) Użycie wyrażenia XQuery TRANSFORM Korzystając z pierwszego sposobu, czyli SQL UPDATE i DELETE, aktualizacja lub usunięcie dotyczy całego dokumentu. Oznacza to, że cały dokument XML zostaje usunięty lub zaktualizowany, np. update author set info= <Info> <Email>joankr@jr.com</Email> <Country>England</Country> <YearOfBirth>1965</YearOfBirth> </Info> where id=41;
Polecenie TRANSFORM Przy użyciu drugiego sposobu, można wykonywać częściową aktualizację za pomocą wyrażenia TRANSFORM (od DB2 9.5), co jest o wiele bardziej efektywne. Dzięki temu można zastąpić, wstawić, usunąć lub zmienić nazwy węzłów w dokumencie XML. Można zmienić wartość węzła bez zastępowania całego węzła, ale zwykle przy zmianach wartości lub nazwy węzła zamieniany jest cały węzeł. Wyrażenie TRANSFORM jest częścią języka XQuery. Można go używać wszędzie tam, gdzie normalnie używamy XQuery, na przykład w wyrażeniach FLWOR lub w funkcjach XMLQUERY w zapytaniach SQL/XML. Najczęściej wykorzystywane jest w instrukcji SQL UPDATE, aby zmodyfikować dokument XML w kolumnie XML.
Polecenie TRANSFORM tworzy kopię wartości XML, zmienia ją, a następnie zwraca wynik, czyli zmodyfikowaną kopię. Polecenia TRANSFORM używamy wewnątrz funkcji XMLQUERY (albo wyrażenia XQuery). Słowo kluczowe PASSING może być wykorzystane aby przekazać wartość XML z kontekstu SQL do kontekstu XML. Wynik polecenia TRANSFORM staje się wynikiem funkcji XMLQUERY. Polecenie TRANSFORM nie zmienia wartości XML, która została przekazana (za pomocą PASSING) - należy użyć instrukcji SQL UPDATE, aby umieścić zmodyfikowaną wartość w tablicy, np. UPDATE author SET info = XMLQuery( transform copy $res := $i modify do insert element Website {"www.jkr.com"} as last into $res/info return $res PASSING info AS "i") where id=41;
Polecenie TRANSFORM Polecenie transform ma trzy (wymagane) klauzule: transform copy variable assignment modify modify expression return return expression Wyrażenie copy jest używane, aby przypisać do zmiennej dokument XML, z którym chcemy pracować. W wyrażeniu modify, możemy podać wyrażenie do insert, do delete, do rename lub do replace. Wyrażenia te pozwalają nam na dokonywanie modyfikacji w naszych dokumentach XML: insert dla dodania nowego węzła, delete - usunięcia węzła, rename - zmiany nazwy elementu lub atrybutu; aby zastąpić element nowym elementem, lub ciągiem kilku nowych elementów, należy użyć wyrażenia replace. Wyrażenie replace może być użyte tylko do zmiany elementu lub atrybutu. Wyrażenie return zwraca wynik transformacji.
Dodawanie nowych węzłów Wyrażenie do insert - aby dodać nowy węzeł. Miejsce wstawienia nowego węzła jest określana na podstawie wyrażenia XPath oraz podanego słowa kluczowego określającego pozycję (before, after, as last into, as first into). UPDATE author SET info = XMLQuery( transform copy $res := $i modify do insert <Email>nowymail@hm.com</Email> before $res/info/country return $res PASSING info AS "i") where id=41;
Usuwanie węzłów Wyrażenie do delete - aby usunąć węzły. Jeżeli wyrażenie XPath podane po "do delete" zwraca więcej niż jeden węzeł, wszystkie te węzły będą usunięte, np. UPDATE author SET info = XMLQuery( transform copy $res := $i modify do delete $res/info/email return $res PASSING info AS "i") WHERE id=41; Powyższe wyrażenie usunie wszystkie węzły Email (w dokumencie XML Info dla autora o id=41).
Zmiana nazwy węzła Wyrażenie do rename - aby zmienić nazwę węzła, nie zmieniając jego pozycji ani wartości, np. chcemy dla każdego autora zmienić w dokumencie Info węzeł Country na BirthCountry: UPDATE author SET info = XMLQUERY( transform copy $res := $i modify do rename $res/info/country as "BirthCountry" return $res PASSING info AS "i") Wyrażenie XPath podane po "do rename" musi zwracać dokładnie jeden węzeł, w przeciwnym przypadku dostaniemy błąd.
Zmiana nazwy węzła Jeżeli wyrażenie XPath podane po "do rename" zwraca wiele węzłów, można wykorzystać FLOWR, by zmienić nazwy wszystkich pasujących elementów, np. aby zmienić nazwę każdego węzła Translation (których może być zero lub kilka) na Version w dokumencie translations (w tabeli edition): UPDATE edition SET translations = XMLQUERY( transform copy $res := $trans modify for $t in $res//translation return do rename $t as "Version" return $res PASSING translations AS "trans")
Zmiana nazwy atrybutu Wyrażenie do rename - aby zmienić nazwę atrybutu. Dodajmy do węzła Info nowy węzeł NewEmail z atrybutem Type, z kopią wartości z węzła Email (ale tylko dla autora z id=41): UPDATE author SET info = XMLQuery( transform copy $res := $i modify do insert <NewEmail Type="work"> {$res/info/email/text()} </NewEmail> after $res/info/email return $res PASSING info AS "i") where id=41; Zmiana nazwy atrybutu Type na status: UPDATE author SET info = XMLQUERY( transform copy $res := $i modify do rename $res/info/newemail/@type as "status" return $res PASSING info AS "i") where id=41;
Zamiana węzła Wyrażenie do replace - może być użyte, aby zamienić węzeł na inny. Wyrażenie XPath podane w replace identyfikuje węzeł (musi wskazywać dokładnie jeden węzeł) i następnie zamienia go na węzeł (albo sekwencję węzłów). Np. zamiana węzła Email na węzeł Skype (dla autora z id=41): UPDATE author SET info = XMLQUERY( transform copy $res := $info modify do replace $res//email with element Skype {"j.k.rowling.author"} return $res PASSING info AS "info") WHERE id=41;
Zamiana węzła Wyrażenie do replace - może być użyte, aby zamienić węzeł na inny. Wyrażenie XPath podane w replace identyfikuje węzeł (musi wskazywać dokładnie jeden węzeł) i następnie zamienia go na węzeł (albo sekwencję węzłów). Np. zamiana węzła Email na sekwencję (dla autora z id=41): UPDATE author SET info = XMLQUERY( transform copy $res := $info modify do replace $res//email with (element Skype {"carl.sagan.author"}, element Phone {"1234"}) return $res PASSING info AS "info") WHERE id=41;
Zamiana wartości węzła Wyrażenie do replace - może być też użyte, aby zamienić wartość węzła (elementu lub atrybutu). Należy użyć polecenia do replace value of. Np. aby zmienić datę urodzenia, czyli wartość węzła YearOfBirth autora o id=41, można użyc polecenia: UPDATE author SET info = XMLQUERY( transform copy $res := $i modify do replace value of $res/info/yearofbirth with 1914 return $res PASSING info AS "i") WHERE id=41;