XML

XML je zkratkou pro eXtensible Markup Language. Z názvu je patrné, že se jedná o značkovací jazyk. Je to však speciální značkovací jazyk, jde totiž o tzv. metajazyk, což znamená, že se pomocí něj dají definovat i jazyky jiné (XHTML je HTML definované pomocí XML) [novaGenerace]. Výhoda XML spočívá v jeho jednoduché syntaxi, platformové nezávislosti a také možnosti definovat si své vlastní tagy (značky). Snadno si tím můžeme specifikovat formát přenášených dat mezi aplikacemi. Další výhodou je striktní oddělení obsahu od formy. Jazyk XML nepovoluje jakékoliv formátovací značky, které webdevelopeři v HTML často používají. Díky tomu, že v dokumentech psaných čistě v XML nemáme jakékoliv informace o vzhledu, můžeme je aplikovanými styly a následnými transformacemi dostat v mnoha různých výstupech: HTML, PDF, DOCx a jiné. Realizace takového výstupu z (X)HTML je prakticky nemožná nebo velmi náročná [uvodXMLKosek].

Příklad 3.1. Ukázka zápisu XML

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE katalogProduktu SYSTEM "katalogProduktu.dtd">
<produkt> 
    <název>Lenovo G550</zařízení>
    <typ>notebook</typ>
    <cena>
        <bezDPH>10 000</bezDPH>
        <sDPH>11 900<sDPH>
        <měna>Kč</měna>
    </cena>
    <popis>Tento notebook se vyznačuje..</popis
</produkt>


DTD a XML schémata

K tomu, abychom mohli vytvářet své vlastní jazyky, slouží DTD nebo XML schémata. Pomocí nichž můžeme definovat strukturu a syntaxi nového jazyka. Pokud dokument propojíme s nějakým DTD nebo XML schématem, jsme schopni pomoci parseru hned zkontrolovat, zda tento dokument vyhovuje sepsaným pravidlům. DTD či schémata nám můžou také urychlit psaní XML dokumentů, protože píšeme-li dokument v programu, který umí propojit psaný dokument se soubory DTD nebo schémat, nedovolí nám vepsat nepovolený tag, ale naopak nám bude přímo nabízet možné tagy, které jsme na dané úrovni schopni napsat.

V příkladu 3.1 – „Ukázka zápisu XML“ tedy respektujeme strukturu dokumentu zadanou souborem DTD katalogProduktu.dtd 3.2 – „Ukázka DTD dokumentu katalogProduktu.dtd. Produkt se skládá z názvu, typu, ceny a popisu, přičemž cena je složena z ceny bez a s DPH a měny. Díky DTD dokumentu jsme schopni dále definovat, vzájemné kombinace elementů, které se mohou opakovat či být vynechány atd. Například obsahem elementu popis mohou být jak samotná PCDATA, tak odstavce uzavřené do tagu EM (emphasize).

Příklad 3.2. Ukázka DTD dokumentu katalogProduktu.dtd

<!ELEMENT produkt    (název, typ, cena, popis)>
<!ELEMENT název      (#PCDATA)>
<!ELEMENT typ        (#PCDATA)>
<!ELEMENT cena       (bezDPH, sDPH, měna)>
<!ELEMENT bezDPH     (#PCDATA)>
<!ELEMENT sDPH       (#PCDATA)>
<!ELEMENT měna       (#PCDATA)>
<!ELEMENT popis      (#PCDATA|em)*>


Rozdíl mezi DTD a XML schématy je v možnostech definování datových typů a v syntaxi. V obou případech mají XML schémata navrch. Kvůli DTD se totiž musíte naučit další jazyk (i když není moc složitý). XML schéma dovoluje definovat nové datové typy z již existujících a také vytvořit schéma na základě již vytvořeného. Naopak DTD je již zavedený standard a mnoho vývojářů se na jeho obranu staví s tvrzením, že XML schémata jsou příliš složitá. Pro úplnost zde uvedeme ještě ukázku XML schématu.

Příklad 3.3. Ukázka XML schématu. (Zdroj: [XMLschemaKosek])

<element name="faktura">
  <type>
    <element ref="odberatel"/>
    <element ref="dodavatel"/>
    <element ref="polozka" minOccurs="1" maxOccurs="*"/>
    <attribute name="cislo" type="string"/>
    <attribute name="vystaveni" type="date"/>
    <attribute name="splatnost" type="date"/>
    <attribute name="vystavil" type="string"/>
  </type>
</element>


Jmenné prostory (Namespaces)

Jmenné prostory jsou jednou z hlavních výhod XML jako univerzálního značkovacího jazyka. Jmenný prostor se deklaruje pomocí atributu xmlns v elementu, v němž (a jeho dceřiných elementech) se jmenný prostor bude používat. Název jmenného prostoru může být libovolný, je však běžnou praxí používat libovolné URL. Zvolené URL může být smyšlené, nemusí vůbec odkazovat na nějaký existující dokument. Předpona jmenného prostoru se píše ve značce prvku před vlastní název prvku a odděluje se dvojtečkou.

Příklad 3.4. Ukázka definice jmenného prostoru a zápisu prefixu

<?xml version="1.0" encoding="UTF-16"?>
<xy:dokument xmlns:xy="http://www.example.com/xy">
    <xy:název xy:atribut="hodnota">Textový název</xy:název>
    ...
</xy:dokument>


Pomocí jmenných prostorů lze zamezit případným kolizím názvů elementů. Když totiž použijeme v XML dokumentu vícero XML schémat (nebo DTD), nebude jasné, které schéma se má použít pro validaci daného elementu. Díky jmenným prostorům tento problém hravě vyřešíme použitím rozdílného prefixu pro každé schéma.

XPath

Abychom mohli k datům uloženým v XML struktuře pohodlně přistupovat (obdobně jako dotazy v SQL), existuje dotazovací jazyk XPath. Ten umožňuje díky jednoduché syntaxi zapsat dotaz, kterým vybereme určité uzly z dokumentu. Cesta k jednotlivým uzlům může popsána absolutně nebo relativně v rámci stromové struktury dokumentu. Ve své nejjednodušší podobě si můžeme XPath dotaz představit jako cestu k nějakému souboru v adresářové struktuře na disku. Například dotaz /dokument/zahlavi/datum nám vrátí uzel, který odpovídá elementu datum, umístěném v elementu zahlavi, uvnitř elementu dokument. Tady samozřejmě možnosti jazyka XPath nekončí. Naopak, díky operátorům, funkcím, podmínkám či šablonám se můžeme dostat k přesně takovým výsledkům, které potřebujeme. Je třeba si také uvědomit, že výsledkem XPath výrazu může být jeden, více nebo žádný XML element nebo atribut. Jeho variabilita je tedy značná. Blíže se zde však XPathu věnovat nebudeme, protože prostor této práce je omezený.