XML snadno a rychle Martin Kuba, ÚVT MU
V tomto pˇ ríkladu je koˇ renem struktury tag výlet, který obsahuje tˇ ri tagy úˇ castníci, trasa, svaˇ cina, z nichž každý obsahuje další tagy atd. Zajímavý je druhý tag vˇ ec, který obsahuje zároveˇ n text, vnoˇ rený tag a má atribut. V místech mezi tagy, kde není jiný viditelný text, m˚ užou být mezery, tabulátory a konce ˇ rádk˚ u, které jsou považovány za nevýznamné (anglicky ignorable whitespace). Naopak konec ˇ rádku a mezery za textem ˇ rízek jsou významné, protože bezprostˇ rednˇ e sousedí s textem. Pokud tag neobsahuje text ani vnoˇ rené tagy, lze jej zapsat dvˇ ema rovnocennými zp˚ usoby, bud’ jako otevírající tag bezprostˇ rednˇ e následovaný zavírajícím tagem, nebo jako jediný tag s lomítkem na konci.
Ve filmu Adéla ještˇ e neveˇ ceˇ rela se americký detektiv nauˇ cí plynnˇ e ˇ cesky bˇ ehem cesty vlakem ˇ z knihy s názvem Cesky snadno a rychle. Bohužel, takto efektivní uˇ cebnice jsou málokdy k mání, což je zvlášt’ patrné, pokud se ˇ clovˇ ek rozhodne nauˇ cit dnes takto ˇ casto zmiˇ nované XML. Pˇ ri prvním pokusu se totiž na nˇ ej vyhrne stádo podivnˇ e vyhlížejících pojm˚ u jako DTD, DOM, SAX, Schema, XPath, XPointer, XLink, Namespaces, XSLT a další, z nichž každý je definován mnohastránkovým dokumentem. Slabší povahy mohou pod tímto množstvím standard˚ u propadnout trudnomyslnosti, a odložit uˇ cení XML na pozdˇ ejší dobu.
Samotná data mohou být uložena jedním ze tˇ rí zp˚ usob˚ u – v názvech tag˚ u a atribut˚ u, jako hodnoty atribut˚ u nebo jako text mezi tagy. Pˇ ri rozhodování, zda je lepší uložit nˇ ejaký údaj jako hodnotu atributu nebo jako text, platí jednoduché pravidlo – pokud údaj m˚ uže obsahovat konce ˇ rádk˚ u, musí být uložen jako text, jinak je to jedno.
Tento ˇ clánek by chtˇ el pomoci ˇ ctenᡠri se v této džungli výraz˚ u vyznat a ukázat, které rysy XML jsou prakticky použitelné již dnes a které je možno zatím pominout.
ˇ 1 Cisté XML
V rámci XML dokument˚ u je možné používat všechny znaky množiny UNICODE, což zahrnuje všechny živé a pár mrtvých jazyk˚ u, žádná národnost tedy nepˇ rijde zkrátka.
XML (eXtensible Markup Language) samotné je relativnˇ e jednoduché, intuitivní a praktické. Umožˇ nuje snadno zapsat libovolné informace uspoˇ rádané do stromové struktury. Skládá se totiž z tag˚ u (znaˇ cek, podle slovníku visaˇ cka, jmenovka), které mohou obsahovat vnoˇ rené další tagy nebo text, a každý tag m˚ uže obsahovat tzv. atributy, což jsou dvojice ˇ retˇ ezc˚ u název= hodnota“. Viz zápis informací o hypo” tetickém výletu:
Pro svoji stromovou strukturu je XML výhodné pro zápis dat objektového charakteru, zkuste si schválnˇ e spoˇ cítat, kolik tabulek by bylo potˇ reba pro zápis stejných informací do relaˇ cní databáze. Na rozdíl od jiných druh˚ u textových soubor˚ u lze s informacemi zapsanými v XML zacházet pomocí standardizovaných nástroj˚ u, které umožˇují napˇ n r. kontrolovat zda struktura splˇ nuje nˇ ejaká syntaktická omezení (tj. odpovídá urˇ citému jazyku), transformovat jeden dokument na jiný, nebo zahrnují programová API pro práci s XML soubory. Standardizované nástroje pak šetˇ rí námahu (tj. peníze) pˇ ri práci s daty.
” ”
<úˇ castníci> ” ” úˇ castníci> <start jméno= Kuˇ rim“ /> ” ” <svaˇ cina> chleba ” ˇ rízek ” <poznámka> dobˇ re zabalit!
2 Pomocné konstrukce – DOCTYPE, instrukce, komentᡠre, entity, CDATA Kromˇ e tag˚ u, jejich atribut˚ u a textu m˚ uže XML obsahovat ještˇ e pˇ et dalších jev˚ u. První z nich je odkaz na definici DTD, dále komentᡠre obsažené 1
3.1 DTD
mezi znaky , procesní instrukce obsažené mezi znaky ?>, entity a CDATA sekce, viz pˇ ríklad:
DTD (Document Type Definition) definuje množinu použitelných tag˚ u a atribut˚ u a jejich možné umístˇ ení v XML dokumentu, tedy urˇ citý jazyk založený na XML. Napˇ ríklad DTD pro jazyk XHTML (což je HTML 4 zapsané jako XML) urˇ cuje, že koˇ renovým tagem je , v nˇ em mohou být tagy a , nikoliv však tˇ reba
, ten smí být až uvnitˇ r tagu
. Ukázka kousku možného DTD pro výše uvedený pˇ ríklad:
” ” ”
znaková entita: € pojmenovaná entita: &moje; & ’ ]]> ”
Co je DTD rozebereme v následující sekci. Komentᡠre snad není tˇ reba komentovat. Procesní instrukce jsou texty urˇ cené program˚ um zpracovávajícím XML, jejich formát je libovolný a záleží jen na programu, co s nimi udˇ elá. (Nemˇ ely by však obsahovat data, na to jsou urˇ ceny tagy a text.)
výlet (úˇ castníci,trasa,svaˇ cina) > úˇ castníci (osoba*) > osoba EMPTY> osoba jméno CDATA #REQUIRED>
DTD m˚ uže obsahovat definice entit pro zjednodušení psaní, napˇ ríklad DTD pro XHTML definuje pojmenované entity pro znaky jako jsou matematické znaˇ cky (∀), národní znaky (é) nebo znak eura (€). Dále m˚ uže obsahovat implicitní hodnoty nˇ ekterých atribut˚ u, což ušetˇ rí místo v dokumentech.
Znakové entity umožˇ nují vložit libovolný ze znak˚ u množiny UNICODE pomocí jeho ˇ císelné hodnoty zapsané desítkovˇ e nebo šestnáctkovˇ e.
3.2 XML Schema
Pojmenované entity jsou definovány v DTD a umožˇ nují pohodlnˇ e najednou vkládat složitˇ ejší sekvence znak˚ u.
Bohužel DTD neumí definovat typovost dat, nelze v nˇ em napˇ ríklad stanovit, že atribut kolik tagu vˇ ec musí obsahovat pˇ rirozené ˇ císlo. Proto bylo vytvoˇ reno XML Schema, které umožˇuje uvalit na data typová omezení. Soubory defin nující konkrétní Schema jsou (na rozdíl od DTD, které má sv˚ uj vlastní definiˇ cní jazyk) zapsané opˇ et v XML, a kromˇ e oˇ cekávatelných typ˚ u jako ˇ retˇ ezec, ˇ císlo, ˇ cas, dokáží popsat i složené objekty nebo typy vzniklé omezením jiných typ˚ u, napˇ r. ˇ císelné a ˇ casové intervaly. Ukázka kousku Schema definujícího totéž co poslední dva ˇ rádky z ukázky DTD:
CDATA je mechanismus pro pˇ rímé vložení dat obsahujících znaky vyhrazené pro XML syntaxi, tj. <>&“’ které je mimo CDATA sekce nutné zapisovat pomocí entit < > & " a '.
3 Parsery, DTD a XML Schema – naˇ cítání dokument˚ u Pro naˇ cítání XML dokument˚ u jsou k dispozici standardní knihovny, tzv. parsery, které existují ve dvou provedeních, tzv. validující a nevalidující. Nevalidující parser provádí minimální kontroly, jako zda jsou tagy správnˇ e vnoˇ rovány a všechny atributy mají kolem sebe uvozovky, ale nic víc. To je rychlé a v mnoha pˇ rípadech dostaˇ cující. Naproti tomu validující parser kontroluje, zda tagy, jejich atributy a texty uvnitˇ r tag˚ u splˇují urˇ n citá pravidla. Tato pravidla se zapisují pomocí bud’ historicky staršího DTD, nebo novˇ ejšího XML Schema.
<xs:element name= osoba“> ” <xs:complexType> <xs:attribute name= jméno“ ” type= xs:string“ use= required“ /> ” ”
XML Schema by mˇ elo postupem ˇ casu nahradit DTD, protože kromˇ e definice entit umí všechno co DTD a spoustu vˇ ecí navíc. Trudnomyslný ˇ ctenᡠr budiž ubezpeˇ cen, že XML se dá prakticky používat i bez jakékoliv znalosti DTD a XML Schema. Staˇ cí když si zapamatuje, 2
že by se mohly hodit pro kontrolu správného zápisu XML.
<j1:znaˇ cka xmlns:j1= urn:jazyk1“ ” xmlns:j2= http://www.nekde.cz/jazyk2“ > ” <j2:jináznaˇ cka />
4 DOM a SAX – programová API Pro pˇ rebírání XML dat od parseru se vyvinula dvˇ e programová rozhraní s opaˇ cnou filozofií a opaˇ cnými výhodami a nevýhodami.
Vazba mezi prefixem a URI, které zastupuje, se provádí atributem tvaru xmlns:prefix= URI“ a ” je platná uvnitˇ r tagu, který tento atribut obsahuje. Pro úspornˇ ejší zápis lze jeden jmenný prostor definovat jako implicitní atributem tvaru xmlns= URI“ a všechny tagy bez prefixu (v ob” lasti platnosti) pak patˇ rí do tohoto prostoru.
DOM (Document Object Model) vytvoˇ rí z dat odpovídající strom objekt˚ u v pamˇ eti. Výhoda je, že s takovou reprezentací dat se snadno pracuje. Nevýhody jsou, že objekty v pamˇ eti zabírají až tˇ rikrát víc pamˇ eti než p˚ uvodní XML soubor a vytvoˇ rení objekt˚ u stojí urˇ citý ˇ cas. DOM je rozhraní definované samotným W3C konzorciem a je nezávislé na programovacím jazyce.
Velké zmatení je vyvoláváno tím, že podmnožinou URI jsou stará známá URL1 (Uniform Resource Locator), jenže URI jsou zde použita pouze pro jedineˇ cnost jmenných prostor˚ u, proto URL použitá jako URI na oznaˇ cení jmenného prostoru nemusí odkazovat na existující dokument, dokonce ani stroj uvedený v URL nemusí existovat, pouze reprezentují jedineˇ cnou posloupnost znak˚ u. Pokud tedy URL oznaˇ cující nˇ ejaký jmenný prostor zadáte do prohlížeˇ ce, s nejvˇ etší pravdˇ epodobností získáte chybu Not Found. Toto použití URL je znaˇ cnˇ e kontroverzní, bohužel však zavedené samotným W3C konzorciem.
Naproti tomu SAX (Simple API for XML) pˇ revádí data pˇ ri naˇ cítání XML souboru na posloupnost volání funkcí, tedy urˇ citá funkce je vyvolána vždy na zaˇ cátku každého tagu, jiná na konci každého tagu, další pro každý souvislý úsek textu, a ještˇ e jiná pro každý komentᡠr atd. Nedefinuje žádný obraz dat v pamˇ eti. Výhodou je velká rychlost zpracování a minimální pamˇ et’ová nároˇ cnost, nevýhodou je urˇ cité nepohodlí pˇ ri programování a odpovˇ ednost aplikace za udržování naˇ ctených dat v pamˇ eti. SAX není standardem W3C, bylo vyvinuto ˇ cleny emailové konference XMLDEV a stalo se de facto“ standardem. ”
6 XPath, XLink, XPointer, XQuery – adresy a vyhledávání 6.1 XPath
5 Namespaces – míchání jazyk˚ u
XPath je jazyk pro zápis výraz˚ u popisujících cestu uvnitˇ r XML dokumentu. Lze popsat cestu k tag˚ um, atribut˚ um, text˚ um, procesním instrukcím i komentᡠru ˚m, které se souhrnˇ e oznaˇ cují jako uzly (anglicky nodes). Nelze popsat cestu k entitám nebo CDATA sekcím, protože ty jsou nahrazeny už parserem. Výrazu m˚ uže odpovídat bud’ právˇ e jeden uzel, pak lze výraz chápat jako adresu v rámci dokumentu, nebo více uzl˚ u, pak lze výraz chápat jako vyhledávání v dokumentu. XPath se nejˇ castˇ eji používá v XSLT pro výbˇ er množiny zpracovávaných uzl˚ u a v XPointer pro oznaˇ cení adresy uvnitˇ r dokumentu.
Jmenné prostory (namespaces) byly do XML pˇ ridány až dodateˇ cnˇ e, napˇ ríklad definice DTD vznikla ještˇ e pˇ red jejich zavedením, a proto mohou p˚ usobit jisté obtíže, i když byly zavedeny s ohledem na zpˇ etnou kompatibilitu. Jmenné prostory umožˇ nují kombinovat v jednom XML dokumentu více jazyk˚ u, což je potˇ reba napˇ ríklad v XHTML stránce s vloženým SVG obrázkem, protože XHTML i SVG jsou jazyky založené na XML. Nebo v transformacích popsaných pomocí XSLT (viz dále) jsou v jednom souboru pˇ rítomny programovací tagy transformaˇ cního jazyka i tagy cílového jazyka.
Cesta v XPath výrazu se zapisuje jako jeden nebo více krok˚ u oddˇ elených lomítky. Zaˇ cíná v tvz.
Tagy a atributy z r˚ uzných jazyk˚ u se odlišují prefixy pˇ red dvojteˇ ckou, samotné prefixy jsou nevýznamné, pouze zastupují URI (Uniform Resource Identifier) definující jmenný prostor, viz pˇ ríklad:
1 Kromˇ e URL patˇ rí mezi URI ještˇ e tzv. URN – Uniform Resource Name, oznaˇ cující zdroj bez ohledu na jeho umístˇ ení
3
kontextovém uzlu, který je urˇ cen mechanismem mimo XPath, napˇ ríklad v XSLT je to právˇ e zpracovávaný uzel. Kroky je možno zapisovat dvˇ ema zp˚ usoby, zkráceným a nezkráceným.
” Click here
Ve zkráceném zápisu osoba urˇ cuje tag osoba“, ” @jméno atribut jméno“, .. nadˇ rízený uzel, / ” vrchol dokumentu, // kdekoliv v dokumentu, text() textový obsah tagu, comment() komentᡠr, processing-instruction() instrukci. Lze použít obecné popisy, * oznaˇ cuje jakýkoliv tag, node() jakýkoliv uzel a @* jakýkoliv atribut.
6.3 XPointer XPointer kombinuje XLink a XPath, umožˇ nuje odkázat na ˇ cást libovolného XML dokumentu. Jako v HTML dokumentech je možné v URL uvést ˇ cást dokumentu pomocí znaku # a názvu ˇ cásti, napˇ r.
V nezkráceném zápisu se kroky zapisují ve tvaru osa::test. Osa (anglicky axis) urˇ cuje smˇ er kroku (existuje jich 13, napˇ r. child – pˇ rímý potomek, descendant – potomek, parent – nadˇ rízený uzel, following-sibling – uzly na stejné úrovni za kontextovým uzlem). Test vybírá uzel, ˇ retˇ ezec jméno vybírá uzel jménem jméno“. ” Za zkrácený i nezkrácený zápis lze dále doplnit tzv. predikáty, zapisované mezi hranaté závorky. Predikáty jsou pravdivostní výrazy, dále omezující výbˇ er uzl˚ u, napˇ r. [@vˇ ek>18] vybere pouze uzly, obsahující atribut vˇ ek s ˇ císelnou hodnotou vyšší než 18, nebo [position()=3] vybere jen uzel, který je tˇ retí v poˇ radí.
http://nekde.cz/dokument.html#cast3
XPointer umožˇ nuje odkázat na ˇ cást XML dokumentu urˇ cenou pomocí XPath výrazu, napˇ r. http://nekde.cz/doc.xml#xpointer(//cast)
XPointer je také záležitost nová4 a neexistuje mnoho implementací. 6.4 XQuery Horká novinka5 je XQuery, dotazovací jazyk pro vyhledávání v XML datech, podobnˇ e jako SQL je jazyk pro vyhledávání v relaˇ cních databázích. Tento standard se teprve vyvíjí a vynucuje si vývoj nové verze jazyka XPath 2.0, v souˇ casné dobˇ e tedy není prakticky použitelný.
Uved’me tedy konkrétní pˇ ríklad. Cesta /výlet/child::*/vˇ ec[@kolik=1]/text()
zaˇ cíná na vrcholu dokumentu, první krok vybírá tagy výlet, druhý krok všechny jejich pˇ rímé potomky, tˇ retí krok vybere mezi jejich pˇ rímými potomky tagy vˇ ec, ale jen ty s atributem kolik sˇ císelnou hodnotou 1, a poslední krok volí textový obsah tagu. Ve výše uvedeném pˇ ríkladu této cestˇ e odpovídá jeden uzel, a to text chleba.
Trudnomyslný ˇ ctenᡠr m˚ uže existenci XLink, XPointer a XQuery zatím pominout, avšak znalosti XPath se asi nevyhne.
XPath je díky svému použití v XLST stylesheetech (viz dále) velice dobˇ re zavedený2 a mnohokrát naimplementovaný standard. 6.2
7 XSLT, XSL, XSL:FO – vzhled a pˇ remˇ eny XML definuje pouze syntaxi, nikoliv však význam nebo vzhled dat. Pokud je tˇ reba data zobrazit, je nutné pˇ ridat informace o tom, jak data pˇ revést do vizuální podoby. K tomu se používají tzv. stylesheety zapisované pomocí XSL.
XLink
XLink umožˇ nuje odkazy mezi celými XML dokumenty, oproti hyperlink˚ um známým z HTML umožˇ nuje i dvousmˇ erné nebo dokonce vícesmˇ erné odkazy. XLink je záležitost znaˇ cnˇ e nová3 a nepˇ ríliš implementovaná, prohlížeˇ c Mozilla implementuje pouze jednosmˇ erné odkazy funkˇ cnˇ e odpovídající hyperlink˚ um známým z HTML: 2 3
XSL (eXtensible Stylesheet Language) je norma složená ze dvou nezávislých ˇ cástí: XSLT a XSL:FO. 4
W3C Recommendation z 16. listopadu 1999 W3C Recommendation z 27. ˇ cervna 2001
5
4
W3C Proposed Recommendation z 13. listopadu 2002 W3C Working Draft z 15. prosince 2002
7.1
XSL:FO (XSL Formating Objects)
XSL:FO je soubor typografických objekt˚ u, jako jsou stránky, bloky textu, poznámky pod ˇ carou atd., a jejich vlastností (anglicky properties) jako šíˇ rky okraj˚ u, fonty, barvy. Objekty v XSL:FO jsou založeny na objektech používaných v CSS2 (Cascading StyleSheets) pro formátování HTML. XSL:FO objekty jsou zapsatelné jako XML tagy v jistém konkrétním jmenném prostoru, takže je možné je uložit jako XML dokument, nebo mohou být pˇ rímo zobrazeny. Ukázka zápisu odstavce a kurzívou zvýraznˇ eného slova:
7.3 Podpora v prohlížeˇ cích Prohlížeˇ ce Mozilla 5 a MSIE 6 v sobˇ e již mají zahrnutu implementaci XSLT. Je tedy možné hned ted’ zobrazovat XML dokumenty. Pokud XML soubor obsahuje odkaz na XSLT stylesheet provádˇ ející transformaci na HTML (pomocí procesní instrukce, ˇ ctenᡠr si to m˚ uže vyzkoušet doplnˇ eˇ ním rádku ” ”
do pˇ ríkladu s výletem a uložením pˇ ríkladu XSLT do souboru vylet.xsl), stylesheet je aplikován a výsledné HTML pak prohlížeˇ c zobrazí. Pokud XML soubor odkaz neobsahuje, použije se implicitní stylesheet, který u MSIE zobrazí XML s barevnˇ e zvýraznˇ enou syntaxí a JavaScriptem implementovanou možností tagy rozbalovat“ a ” zavírat“. V Mozille se použije implicitní style” sheet definovaný normou XSLT, který vynechá všechny tagy a zobrazí pouze text.
” Nˇ ejaký ” text odstavce ...
7.2
XSLT (XSL Transformations)
XSLT je programovací jazyk, ve kterém se popisuje transformace XML dokumentu na jiný strom objekt˚ u. P˚ uvodním zámˇ erem XSLT byla transformace XML dokumentu na strom XSL:FO objekt˚ u, které jsou následnˇ e zobrazeny.
Bohužel, dnešní prohlížeˇ ce nemají implementovánu podporu XSL:FO, existuje však nástroj Apache FOP, který umí pˇ revést strom XSL:FO objekt˚ u na PDF soubor. Je tedy možné XML dokument pˇ revést pomocí XSLT procesoru na soubor XSL:FO tag˚ u a ty pak pomocí FOPu pˇ revést na PDF.
Je však možné popsat transformaci na libovolný jiný XML dokument, na HTML dokument, nebo dokonce na libovolný textový výstup. Pˇ ri aplikaci r˚ uzných stylesheet˚ u na jeden XML soubor je tak možné získat r˚ uzné výstupy (HTML, text, XSL:FO, XML) a pokud je výsledkem transformace opˇ et XML dokument, je možné transformace ˇ retˇ ezit.
8 Závˇ er a odkazy
XML samotné je pomˇ ernˇ e stabilní standard. Na nˇ ej navazující standardy jako XSLT, XPath se bouˇ rlivˇ e vyvíjejí a jsou nahrazovány novˇ ejšími Ukázka XSLT stylesheetu generujícího seznam verzemi. Další standardy jako XML Signature (divˇ ecí na výlet jako HTML stránku: gitální podpis) nebo SOAP (vzdálené volání procedur pomocí XML) byly právˇ e dokonˇ ceny nebo ” <xsl:stylesheet version= 1.0“ se teprve dokonˇ cují a lze v blízké dobˇ eˇ cekat je” xmlns:xsl= http://www.w3.org/1999/XSL/Transform“ > jich další verze. Pˇ r esto je možné XML s úspˇ echem ” <xsl:output method= html“/> ” používat již dnes, protože je dostupných mnoho <xsl:template match= /“> ” nástroj˚ u pro zpracování XML, jak komerˇ cních
Výlet tak freewareových, a jeden z nich má pravdˇ epo dobnˇ e každý z nás již ve svém WWW prohlížeˇ ci. <xsl:for-each select= //vˇ ec“> ” <xsl:value-of select= @kolik“/> ” <xsl:value-of select= text()“/>
”
– W3C definice http://www.w3c.org/xml/ – kniha E. R. Harold, W. S. Means: XML in a ” nutshell“, O’Reilly 2001, ISBN 0-596-00058-8 – parser Apache Xerces http://xml.apache. org/xerces2-j/ 5
– XSLT procesor Saxon http://saxon.sf.net – Apache FOP http://xml.apache.org/ fop/
6