TÉMATICKÝ OKRUH Softwarové inženýrství
Číslo otázky : Otázka :
23. Datový model XML, dotazovací jazyky nad XML daty
Obsah : 1 Úvod o XML 2 Vztah XML a databáze 2.1 Databázové systémy s podporou XML 2.2 Nativní XML databázové systémy 3 Datový model XML 3.1 XML Strom 4 Dotazovací jazyky nad XML daty 4.1 Xpath 4.2 Xquery
!!! Kapitola 1 a 2 jsou jen informativní !!! 1. Úvod o XML (eXtensible Markup Language) Je obecný značkovací jazyk, který byl vyvinut a standardizován konsorciem W3C. Umožňuje snadné vytváření konkrétních značkovacích jazyků pro různé účely a široké spektrum různých typů dat. výhody a přínosy XML • • •
• •
význam dat je nedílnou součástí dat – XML dokumenty nepotřebují externí „logiku“, která by ozřejmovala co který blok dat vyjadřuje. Vše je součástí XML dokumentu. podpora internacionalizace – Jazyk XML je od počátku navržen pro mezinárodní použití a podporuje standard Unicode. univerzální datový formát – Relační databázové systémy jsou vhodné pro data, která je možno „nenásilně“ ukládat do tabulek. Neumí si však adekvátně poradit s komplexními dokumenty a hodně hierarchickými strukturami, což v praktickém životě není nic vzácného Snadná konverze do jiných formátů - Rodina jazyků XSL (eXtensible Stylesheet Language) Ta umožňuje dokument různě upravovat a transformovat Textově orientovaný formát – lze zpracovávat bez specializovaných nástrojů
2. Vztah XML a databáze Lze XML a související technologie považovat za systém řízení báze dat? Systém řízení báze dat je „programový systém umožňující práci s databází. Takže ano. XML technologiích totiž najdeme charakteristiky, na které jsme zvyklí z databázových systémů •
úložiště dat (XML dokument)
•
schéma struktury dat (DTD, XML Schéma, Relax NG,…)
•
databázové jazyky (XPath, XQuery, Xupdate,…)
•
rozhraní pro programátory (SAX, DOM,…)
Na druhou stranu lze ale nalézt i oblasti, kvůli kterým nelze XML zařadit mezi soudobé „plnohodnotné“ systémy řízení báze dat. •
ukládání dat není tak efektivní
•
bezpečnost
•
indexování dat
•
transakce
•
víceuživatelský přístup
•
provádění databázových operací nad více XML dokumenty
XML dokumenty z principu je možné použít jakožto úložiště pro velké objemy dat. Ve srovnání se současnými (často téměř k dokonalosti dovedenými) databázovými systémy se však k tomuto účelu XML jeví jako nevhodné. Hlavní oblasti kde je vhodné XML použít jsou ukládání dokumentů a univerzální formát
pro přenos dat.
2.1 Databázové systémy s podporou XML Databázové systémy s podporou XML (anglicky „XML Enabled DBS“) jsou databázové systémy, které obsahují rozšíření své funkcionality o přenos dat mezi XML dokumentem a svou databází. V současné době lze tímto termínem označit velkou skupinu (převážně relačních) databázových systémů, které s postupným rozšířením XML obohatily svou funkcionalitu. Příkladem jsou známe databázové systémy Microsoft SQL Server 2000, Microsoft Access 2002, Oracle 8i, Oracle 9i, IBM DB2 či Sybase ASE 12.5. 2.2 Nativní XML databázové systémy Nativní XML databázové systémy jsou databázové systémy specializované na ukládání XML dokumentů. Stejně jako ostatní databázové systémy (relační, objektové,…) i tyto podporují transakce, bezpečnost, víceuživatelský přístup, databázové jazyky,… atd Jako „nativní XML“ je označujeme proto, poněvadž při ukládání dat vnitřně pracují s datovým modelem XML. (Na rozdíl od „databázových systémů s podporou XML“, které sice také umožňují ukládat XML dokumenty, ale vnitřně je mapují do jiného datového modelu - např. do relačního modelu.) Tři základní charakteristiky NXDBS (nativní XML DB): • systém řízení báze dat pracuje s datovým modelem XML • základní minimální jednotka uložení dat je XML dokument • logická forma v jaké jsou uložena data databáze není podstatná, může být libovolná Příklady NXDBS: Tamino XML Server , Xindice , Infonyte DB , Db4XML
3. Datový model XML Pojem „datový model XML“ označuje logickou i fyzickou strukturu obecného XML dokumentu. V datovém modelu XML lze najít některé prvky shodné s jinými známými databázovými modely. Svou strukturou je podobný hierarchickému modelu dat, liší se však od něj například tím, že na jedné úrovni v hierarchii nemusí být všechny uzly stejného typu. Pomocí určitého mechanismu (odkazů typu IDREF) lze datový model XML rozšířit na model podobný síťovému modelu dat. Porovnání XML a relačního datového modelu
Datový model XML je velice jednoduchý a abstraktní. XML je díky tomu možno považovat za základnu, na které bývají posléze vystavěny složitější datové modely. XML dokument si lze představit jako linearizaci stromové struktury. Linearizace je ekvivalentní zápis stromové struktury pomocí posloupnosti znakových údajů (dat).V každém uzlu tohoto stromu se nachází několik textových řetězců. Informační obsah XML dokumentu je tedy tvořen touto stromovou strukturou a textovými řetězci uvnitř této struktury. Některé znaky jsou v XML dokumentu pouze kvůli vyjádření linearizace, jiné již tvoří vlastní informační obsah XML
dokumentu. 3.1 XML Strom Strom, který XML dokument vyjadřuje čítá několik různých typů uzlů: •
•
•
•
• •
Element - Stromovou strukturu XML tvoří zejména elementy. Ty jediné totiž mohou obsahovat děti (potomky). Ostatní uzly stromu vždy tvoří listy stromu. Element může obsahovat množini atributů Dokument - Jedná se o speciální případ elementu. Neobsahuje žádné atributy, může však obsahovat URL, které odkazuje na specializovaný datový model XML určený pro tento uzel a jeho děti. pokud první výraz v XML dokumentu není pak má dokument anonymní kořen. Instrukce pro zpracování (processing instruction) - Takovýto uzel je vždy listem stromu. Obsahuje pouze instrukci i. Instrukce je posloupnost nula či více znaků bez jakýchkoliv omezení (nesmí začínat znaky „xml“ ). Instrukce se v XML dokumentech používají pro potřeby aplikací (například pro XML parser, což je program, který kontroluje správnost XML dokumentu). Komentář - Komentáře jsou na rozdíl od instrukcí určeny pro potřeby lidí (programátorů, uživatelů, …). Obvykle se do nich vepisují vysvětlení elementů, atributů,… a různé poznámky. Datový uzel - Datové uzly jsou listy stromu. Jejich účel je jediný – obsahují vlastní data. Vše co v XML dokumentu není uzavřeno mezi znaky „<“ a „>“ je pokládáno za data. Atributy – atributy jsou součástí elementu.
4. Dotazovací jazyky nad XML daty 4.1 XPath (http://www.w3schools.com/xpath/default.asp) Jazyk XPath vyvíjený konsorciem W3C slouží k adresování, výběru částí XML dokumentu (navigace mezi elementy a atributy v xml dokumentu). Podobné cestám ve file systému. Pro každý XML dokument je tedy v paměti počítače vytvořen strom, nad kterým XPath vyhodnocuje své výrazy. Mezi uzly stromu se lze pohybovat po různých osách. Následující obrázek znázorňuje aktuální uzel a dostupné osy k okolním uzlům:
Př: /bookstore/book[price>35.00] /bookstore/book/title | //price (všechny bookstore/book/title a elemnty price na urovni dokumentu ) child::* všchny (děti aktuálního uzlu) (je používán po XSLT transformace) Popis od Běhálka: XPath je jazyk používaný pro identifikaci uzlů v XML dokumentu. Pravděpodobně nejdůležitějším rysem jazyka XPath je možnost vyjádření relativní cesty od uzlu k jinému uzlu či atributu. Připomíná dotazovací jazyk SQL, zejména dík tomu, že na základě podmínky vrátí jeden nebo množinu výrazů (nebo žádný) odpovídající vstupní podmínce. Výběr z XPath rodič/potomek
Pokud lomítko umístíme na začátek výrazu, jako počáteční uzel se bere kořen dokumentu. Jinak se nalezne uzel potomek v uzlu rodič aktuálního uzlu
Potomek nemusí být přímým následníkem rodiče - může se vyskytovat hlouběji rodič//potomek ve struktuře. Pokud se nachází dvě lomítka na začátku výrazu (//rodič), naleznou se všechny výskyty elementu rodič v celém dokumentu rodič/*
vybere všechny uzly uzlu rodič v aktuálním uzlu
.
vybere aktuální uzel
..
pohyb na element o úroveň výše
@postup
vybere atribut (zde atribut postup) aktuálního uzlu
[]
podmínka
rodič/potomek[ vybere všechny elementy potomek z elementu rodič aktuálního uzlu, jejichž @atribut="3"] atributy atribut odpovídají podmínce (zde jsou tedy rovny 3) XPath umožňuje rovněž použití funkcí. Zkráceně si některé vypíšeme:
position(), last(), count() vrací pozici aktuálního uzlu, posledního uzlu, počet uzlů v daném kontextu
name(), local-name(), namespace-uri(), úplné jméno, název aktuálního uzlu, název jmenného prostoru
string(), number(), boolean() převod objektu na typ string, number, boolean
contains(), substring-before(), substring-after(), string-length()... práce s řetězci
4.2 Xquery (http://www.w3schools.com/xquery/default.asp) XQuery je postaven na výrazech. Příkaz v XQuery lze považovat za výraz, kterému lze určit jeho hodnotu. XQuery příkaz (skript) může být zapsán např. uvnitř nějaké HTML (XML) stránky -
stejným způsobem jakým bývají psány dynamické WWW stránky (JSP – Java Server Pages, ASP – Active Server Pages,...). Nejběžnější výrazy v XQuery jsou tzv. „FLWR výrazy“ (vyslovuje se jako anglické slovo „flower“). Tyto výrazy jsou obdobou příkazu SELECT-FROM-WHERE z databázového jazyka SQL Výrazem FLWOR se myslí dotazovací výraz složený z klíčových slov: FOR – primární výběr uzlů generující seznam (používá se výraz XPath), LET – definice (přiřazení) proměnných pro každý prvek seznamu posloupnosti, WHERE – tvorba logické podmínky filtrující prvky seznamu, ORDER BY – seřazení vybraných a odfiltrovaných prvků, RETURN – generování výstupu pro každý vybraný a odfiltrovaný prvek, FLWR výrazy
Například tento jednoduchý FLWR výraz vrátí mužské zaměstnance for $zam in doc(”zamestnanci.xml”)//zamestnanci where $zam/pohlavi=”muž” return $zam Do proměnné $zam jsou postupně načítány jednotlivé uzly se zaměstnanci. Funkce doc() slouží k načtení dat (uzlů) z XML dokumentu. Podmínka where omezuje výběr na zaměstnance, kteří mají obsah dětského elementu „pohlaví„ roven slovu „muž“. Vyhovující uzly jsou poté vráceny jako výsledek, k tomu slouží příkaz return. Výsledné získané uzly by vypadaly takto: <jmeno>Pepyk <prijmeni>Molnár <pohlavi>muž ... další zaměstnanci-muži Řazení
K seřazení výsledku slouží klauzule „order by“, která se provede předtím než je zpracována instrukce „return“. for $zam in doc(”zamestnanci.xml”)//zamestnanci order by $zam/prijmeni, $zam/jmeno descending return $zam Eliminování duplicit K vyřazení duplicitních hodnot z výsledku slouží funkce „distinct-values()“. Za duplicitní uzly se považují uzly, jejichž struktura je shodná, a které obsahují stejné obsahy podelementů. for $zam in distinct-values(doc(”zamestnanci.xml”)//zamestnanci) Seskupeni datových zdrojů V praxi často potřebujeme spojovat data z různých datových zdrojů. V teorii relačních databázových systémů se jedná o kartézský součin, který vyjadřujeme operací „join“. V XQuery žádný operátor join neexistuje. Spojení dvou zdrojů dat v XQuery provedeme stejným způsobem jakým ho můžeme provést i v relačních databázových systémech, totiž přes podmínku v sekci „where“.
for $nazev in doc(”knihy.xml”)//nazev, $recenze in doc(”recenze.xml”)//recenze where $nazev = $recenze/nazev_knihy return $recenze Tento dotaz vypíše recenze pouze těch knih, které existují v XML dokumentu „knihy.xml“.
XQuery umožňuje v současné verzi (1.0) provádět pouze výběrové operace. Pracuje se však na rozšíření, které bude obsahovat i možnost provádět modifikační (vkládání, aktualizace, mazání) a definiční operace (měnit strukturu XML dokumentu).