. Dokument je dobře formovaný. Elementy mohou mít své atributy. Atributy elementu se zapisují do počáteční značky mezi název elementu a zavírací špičatou závorku. Pokud element obsahuje atributů více, jsou navzájem odděleny mezerou. Za názvem atributu následuje znaménko = a do uvozovek "" uzavřená hodnota atributu. Na slajdu č. A/26 vidíme u prázdného elementu příloha atribut cesta s hodnotou obr1.png. Na slajdu č. A/27 je ukázka dalších prvků, které se mohou nalézat v XML dokumentu. Komentáře (na slajdu označené zeleně) se uzavírají mezi <-- a -->. Pokud textový obsah elementu obsahuje znaky, které by se mohly interpretovat jako části syntaktických zápisů v XML, můžeme tento obsah uzavřít do sekce CDATA (červeně označeno na slajdu). Instrukce pro zpracování se uzavírají do a ?>, Ihned po začíná název (obvykle skriptovacího) jazyka, který je následován zdrojovým kódem v daném jazyce (modře označeno na slajdu). 2 DTD Jazyk DTD (Document Type Definition) slouží k popisu struktury XML dokumentu. DTD definuje gramatiku dokumentu, která obsahuje pravidla (regulární výrazy) popisující množinu značek, které může daný XML dokument používat a omezuje obsah těchto značek. DTD je historicky nejstarším jazyk sloužící k popisu struktury XML dokumentu. V současné době existují silnější jazyky (umožňující definovat více podrobností). Mezi tyto jazyky patří například XML Schema nebo Relax NG. Validní XML dokument je správně formovaná dokument, který odpovídá své gramatice dané DTD, nebo jinými jazyky pro popis struktury dokumentu. Program, které rozhodne, zda dokument je validní, se nazývá validátor. Na internetu lze nalézt velké množství online validátorů, například [7]. DTD může být součástí validního XML dokumentu, ale může být také v samostatném souboru. V XML dokumentu je pak pouze odkaz na toto DTD. Na slajdu č. A/31 vidíme tři příklady. Na prvním z nich je DTD součásti XML dokumentu. Na druhém příkladě se soubor s DTD nachází ve stejném adresáři jako XML dokument a v XML dokumentu je uvedena k němu pouze cesta. Ve třetím příkladě je v XML dokumentu uvedena cesta k DTD dokumentu umístěném na internetu.
V DTD se jednotlivé značky uzavírají mezi , jejich základní přehled nalezneme na slajdu č. A/32. DTD začíná značkou DOCTYPE, po které následuje název DTD a hranaté závorky, vevnitř kterých mohou být použity ostatní značky ELEMENT, ATTLIST, ENTITY a NOTATION. Na slajdu č. A/33 vidíme příklad použití značky ELEMENT. Značka definuje element a jeho přípustný obsah. V našem příkladě zápis znamená, že element rodič smí obsahovat libovolně mnoho elementů potomek. Na slajdu č. A/34 vidíme jak definovat obsah elementu. Pomocí klíčového slova EMPTY definujeme prázdný element. Pomocí klíčového slova pomocí ANY umožníme, aby element obsahoval libovolný obsah. Textový obsah elementu se definuje pomocí (#PCDATA). Element obsahující jiný element se definuje pomocí názvu vnořeného elementu uzavřeného v kulatých závorkách. Element může obsahovat i více elementů, nebo kombinaci elementů a textového obsahu. Operátor čárky "," vytvoří sekvenci (zřetězení), operátor | vytvoří výběr jedné ze dvou variant. Operátor ? vyjadřuje nepovinný výskyt, operátor * libovolný počet výskytů (včetně žádného) a operátor + libovolný počet výskytů, nejméně však jeden. Vytvořené výrazy lze uzávorkovat pro změnu priority vykonávání operátorů. V definici obsahu elementů záleží na pořadí jednotlivých částí definice. Pokud chceme dovolit libovolné pořadí elementů x a y, musíme použít zápis ((a,b)|(b,a)). Příklad na slajdu č. A/34 dole vyjadřuje následující obsah: První je element název, po kterém nepovinně může následovat jeden ze dvou elementů autor nebo editor. Dále následuje libovolný počet (včetně žádného) elementů p Dále následuje.libovolný počet (včetně žádné) posloupností jednoho elementu nadpis a libovolného nenulového počtu elementů p. 2.1 Atributy Na slajdu č. A/35 vidíme, jak lze definovat atributy elementu pomocí značky ATTLIST. Na pořadí atributů v rámci elementu (na rozdíl od pořadí vnořených elementů) nezáleží. U jednotlivých atributů musíme uvést název a datový typ, můžeme nepovinně uvést požadavky na hodnotu atributu. Datové typy atributů mohou být následující (seznam uveden na slajdu č. A/36): Datový typ CDATA umožňuje uchovávat libovolný řetězec znaků (v příkladu na slajdu č. A/35 nahoře je tohoto typu atribut zaměstnán). Výčtový typ se definuje uvedením seznamu hodnot výčtového typu. Seznam hodnota je uzavřen v kulatých závorkách. Hodnoty jsou navzájem oddělené symbolem |. V našem příkladu je výčtového typu atribut dovolená s hodnotami ano a ne. Datový typ ID lze použít pro atribut, jehož hodnota je unikátním identifikátorem v rámci dokumentu. Identifikátor musí začínat písmenem nebo znakem _, obsahovat může písmena, číslice a několik málo interpunkčních symbolů. V našem příkladu je tohoto typu atribut číslo. Atribut datového typu IDREF má hodnotu obsahující odkaz na identifikátor ID jiného elementu. Hodnotou datového typu IDREFS je seznam identifikátorů ID oddělených mezerou.
Datový typ NMTOKEN je obdobou typu ID. Identifikátor, který může obsahovat, nemusí být unikátní a může začínat i číslicí. Datový typ NMTOKENS je obdobou typu IDREFS, ale místo seznamu identifikátorů ID obsahuje seznam identifikátorů NMTOKEN. Na hodnoty atributů můžeme mít dodatečné požadavky. Pokud má být výskyt atributu povinný, uvedeme na konci jeho deklarace #REQUIRED. V našem příkladu se jedná o atribut číslo. Nepovinný atribut může (ale nemusí) být označen jako #IMPLIED. Atribut s konstantní hodnotou se označuje jako #FIXED, za tímto označením následuje povinná neměnná hodnota. V našem příkladu se jedná o atribut zaměstnán s implicitní hodnotou "ano". 2.2 Entity Entita v XML dokumentu je identifikátor, který se používá uvozený symbolem & a zakončený středníkem. Entita v XML dokumentu zastupuje symbol (znakové entity) nebo řetězec znaků (obecné entity). V DTD mohou být definovány parametrické entity, které jsou uvozeny symbolem % a zakončeny středníkem. Znakové entity slouží k nahrazení jednoho znaku. Využívají se obvykle pro znaky, které uvozují syntaktické konstrukce v XML a nelze je proto napsat přímo (&, <, >, ', "), protože parser by je chápal jako začátky těchto konstrukcí. Příklady znakových entit v XML dokumentu vidíme na slajdu č. A/39. V obou příkladech na slajdu řešíme jak nahradit matematický symbol < entitou. Symbol < nelze napsat přímo, parser by ho považoval za začátek elementu. Na výběr máme mezi jeho zápisem v desítkové či šestnáctkové soustavě < (první příklad) nebo použitím předdefinované entity pro speciální znaky < (druhý příklad). Obecné entity slouží k nahrazení opakující se částí XML dokumentu jedním identifikátorem (interní entity) nebo pro rozdělení jednoho XML dokumentu do více modulů (externí entity). Interní entita se definuje pomocí značky ENTITY následované identifikátorem entity a její hodnotou uzavřenou v uvozovkách. Externí entita se definuje pomocí značky ENTITY následované identifikátorem entity, klíčovým slovem SYSTEM a v uvozovkách uzavřeným názvem souboru, ve kterém se nachází obsah entity. Na slajdu č. A/40 vidíme dva příklady definice obecných entit. V horním příkladu definujeme interní entitu stav, která je v XML dokumentu použita uvnitř elementu poznámka. V dolním příkladě definujeme externí entitu xml-seriál, její obsah se nalézá v souboru xmlseriál.txt. Parametrické entity slouží v DTD k zpřehlednění a zkrácení jeho zápisu. Definují se obdobně jako interní entity, ale navíc je před jejich názvem uveden symbol %. Použít je lze pouze na jiném místě DTD, uvedením symbolu %, názvu entity a středníku. Na slajdu č. A/42 vidíme definici parametrické entity atributy, která je v příkladu použita na několika místech pro definici seznamu atributů různých elementů. 3. XML v SQL Serveru Práce s XML v každém databázovém systému bývá řešena rozdílnými způsoby. My si v této kapitole popíšeme situaci v SQL Serveru 2005.
Na slajdu č. B/24 vidíme příklad, jak lze vytvořit tabulku obsahující sloupec (Dok) datového typu XML. Hodnotou sloupce Dok je celý XML dokument. Pomocí příkazu INSERT lze tabulku naplnit daty, hodnota (= XML dokument) vkládaná do sloupce Dok musí být v apostrofech (viz příklad dole na slajdu). Můžeme také naopak exportovat data z tabulek do formátu XML, dokonce můžeme exportovat i výsledek celého dotazu. Na slajdu č. B/25 vidíme rozšířenou syntax příkazu SELECT, která umožňuje výsledek dotazu zobrazit jako XML dokument. Za příkaz SELECT se přidají klíčová slova FOR XML a jeden z následujících módů: RAW, AUTO, EXPLICIT nebo PATH. Například SELECT * FROM zákazník FOR XML AUTO exportuje do XML tabulku zákazník. Na slajdu č. B/26 vidíme použití módu RAW. Pro každý řádek výsledku dotazu se vytvoří samostatný element pojmenovaný row. Název elementu row lze změnit uvedením požadovaného názvu v apostrofech do závorky za klíčové slovo RAW. Například … FOR XML RAW ('řádek‘). Jednotlivé sloupce výsledku dotazu jsou atributy elementu a hodnoty sloupců jsou hodnotami těchto atributů. Na slajdu č. B/27 vidíme použití módu AUTO. Pro každý řádek výsledku dotazu a pro každou použitou tabulku ve výsledku dotazu vytvoří samostatný element. Názvy elementů odpovídají názvům tabulek. Struktura zanoření elementů odpovídá pořadí spojení tabulek. Nejhlouběji zanořený element je ten, jehož tabulka je v klauzuli FROM uvedena jako poslední. K oběma módům RAW a AUTO lze použít nepovinný modifikátor ELEMENTS, který ze sloupců výsledku dotazu vytvoří místo atributů samostatné podelementy. Příklad je uveden na slajdu č. B/28. Modifikátor ELEMENTS se přidává za klíčová slovo AUTO nebo RAW a je od nich oddělen čárkou. Například … FOR XML AUTO, ELEMENTS. Dalším užitečným modifikátorem je ROOT, za kterým je v závorce a apostrofech uvedeno jméno kořenového elementu, který bude obalovat všechny elementy vytvořené pro jednotlivé řádky výsledku dotazu. Tento modifikátor se odděluje od zbytku dotazu čárkou, obdobně jako modifikátor ELEMENTS. Například … FOR XML RAW, ROOT('kořen'). Na slajdu č. B/29 vidíme jaké indexy lze vytvořit pro XML data. Pokud plánujeme v těchto datech často vyhledávat (tématické bloky č. 5 a 6), je vytvoření těchto indexů nezbytné. Nejprve je nutné vytvořit primární XML index příkazem CREATE PRIMARY XML INDEX. Na slajdu nahoře tento index vytváříme a pojmenováváme XmlIdx. Následně s použitím tohoto indexu lze vytvořit tři samotné indexy: index cest (PATH), hodnot (VALUE) a vlastností (PROPERTY). Příklad je uveden v dolní části slajdu. Klíčové pojmy XML, DTD element, značka, atribut, správně formovaný dokument, správně uzávorkovaný dokument validní dokument CDATA, ID, IDREF, IDREFS Entita (znaková, obecná, interní, externí, parametrická)
Otázky k rekapitulaci Upozornění: odpovědi na některé zde uvedené otázky nelze najít ve studijním textu tohoto tématického bloku. Lze je získat vlastním experimentováním se zdrojovými kódy nebo studiem doporučené literatury. Jaký je rozdíl mezi elementem a značkou? Lze nahradit atribut vnořeným elementem ? Lze nahradit vnořený element atributem? Co může obsahovat element? Jaké podmínky musí splňovat správně formovaný XML dokument? Na vhodných příkladech ukažte porušení těchto podmínek. Jakým způsobem se v XML označují instrukce pro zpracování a k čemu slouží? K čemu se v XML používá sekce CDATA? Kdy je její použití rozumné? Čím ji lze nahradit? Vysvětlete DTD uvedené na slajdu č. A/45. K čemu slouží DTD, jaké má jeho použití výhody? Jak v DTD definujeme obsah elementu? Jakým způsobem v DTD definujeme, že nezáleží na pořadí elementů? Lze v DTD definovat, že záleží na pořadí atributů ? Jaké typy atributů lze v DTD definovat? K čemu slouží entity v XML, jaké typy známe a jak se používají? K čemu slouží entity v DTD? Své odpovědi zdůvodněte. Můžete přidat i syntaktické zápisy tam, kde je to vhodné. Doporučené příklady k naprogramování 1. Napište validní XML dokument k DTD uvedenému na slajdu č. A/45, tak aby v něm byl využit každý řádek z DTD. Validitu vytvořeného XML dokumentu ověřte validátorem [7]. 2. Vytvořte DTD pro některý z XML dokumentů nacházejících se v souboru xml.zip (uloženém v adresáři se studijními materiály tohoto předmětu). Validitu daného XML souboru vůči vámi vytvořenému DTD zkontrolujte validátorem. 3. Vytvořte zajímavé DTD, které bude obsahovat co nejvíce probíraných prvků. K tomuto DTD vytvořte XML dokument, zkontrolujte ho validátorem. 4. Vytvořte tabulku (pojmenovanou XMLTab) se sloupcem datového typu XML a do této tabulky vložte všech pět XML dokumentů (pro každý dokument bude vytvořen jeden řádek tabulky) ze souboru xml.zip. Pro tabulku vytvořte všechny možné XML indexy. 5. Vytvořte dotaz obsahující spojení tří tabulek z databáze Northwind. Výsledek dotazu uložte jako XML pomocí módů RAW a AUTO v kombinaci s modifikátory ROOT, a ELEMENTS. Vyzkoušejte všechny varianty a výsledky si prohlédněte.
Studijní literatura [1] Mlýnková, Nečaský: Slajdy k 1. přednášce z předmětu technologie XML (PRG036) vyučovaného na MFF UK (v tomto tématickém bloku označované jako „slajdy A“, například slajd č. A/xx). https://is.vsfs.cz/auth/el/6410/leto2010/EQ_N_DS/um/DS4a.ppt [2] Kopecký: Výběr ze slajdů k 7. přednášce z předmětu Databázové aplikace (DBI026) vyučovaného na MFF UK(v tomto tématickém bloku označované jako „slajdy B“, například slajd č. B/xx). https://is.vsfs.cz/auth/el/6410/leto2010/EQ_N_DS/um/DS4b.ppt [3] XML dokumenty používané v doporučených příkladech k naprogramování (5 her od Shakespeare) https://is.vsfs.cz/auth/el/6410/leto2010/EQ_N_DS/um/xml.zip [4] Mlýnková a kol.: Technologie XML - Principy a aplikace v praxi. Grada, Praha, 2008. [5] Seriál článků o XML: http://programujte.com/?akce=clanek&cl=2007030501-xml-prozacatecniky-1-cast [6] http://www.kosek.cz/xml/ [7] Online XML validátor: http://www.xmlvalidation.com/