DTD a automatická kontrola struktury dokumentu

Jiří Kosek


Obsah

Deklarace elementů
Deklarace atributů
Připojení DTD k dokumentu
Automatická kontrola struktury dokumenty
Entity
Stačí nám DTD?

Pomocí XML můžeme vytvářet vlastní jazyky, které budou používat syntaxi XML. V našem jazyku odvozeném od XML si můžeme definovat, které elementy a atributy budou k dispozici a jak je půjde navzájem kombinovat. Této definici se říká DTD – definice typu dokumentu.

Použití DTD přináší mnoho výhod. Asi největší z nich je možnost automatické kontroly XML dokumentu oproti DTD. Pomocí parseru můžeme velice snadno zjistit, zda v dokumentu něco nechybí nebo naopak nepřebývá. Pokud bychom například do XML ukládali faktury a měli pro ně odpovídající DTD, může zkontrolovat, jestli faktura obsahuje všechny náležitosti – dodavatele, odběratele, datum splatnosti apod.

Další výhody přináší používání již existujících DTD. Pokud pro naše dokumenty použijeme nějaké DTD, které se běžně používá, otevřeme si cestu k použití mnoha jednoúčelových nástrojů, které práci s dokumenty usnadní. Jako příklad nám může posloužit jazyk HTML – ten je definován také pomocí DTD (i když pro jazyk SGML a ne XML) a dnes ho přímo podporuje nepřeberné množství editorů, prohlížečů a dalších aplikací.

Deklarace elementů

Každý XML dokument se skládá z elementů. Podíváme se proto nejdříve na to, jak se v DTD deklarují jednotlivé elementy, které můžeme v dokumentu používat. Při deklaraci vždy určujeme jméno elementu a model obsahu, který určuje jaké další elementy může právě definovaný element obsahovat.

Definice elementu faktura, může vypadat třeba takto

<!ELEMENT faktura (odberatel, dodavatel, polozka+)>

Tímto zápisem jsme definovali element faktura, který musí obsahovat element odberatel, dodavatel a několik elementů polozka.

Název elementu musí vždy začínat písmenem, pro další znaky lze použít i čísla, tečku, dvojtečku, pomlčku a podtržítko. Za písmeno jsou považovány samozřejmě i jiné znaky než jen ty z anglické abecedy. Můžeme proto v názvech používat klidně znaky z českou diakritikou nebo azbuku. Jediný problém je v tom, že některé programy v rozporu s XML specifikací neumějí s těmito znaky v názvu elementů pracovat (do této skupiny patří například parser od Microsoftu).

Při deklaraci elementu je vždy nejdůležitější správně určit jeho model obsahu. Tím je totiž určena přípustná struktura dokumentu. Pro velice jednoduché případy lze použít jako model obsahu klíčové slovo EMPTY nebo ANY. Použijeme-li EMPTY, říkáme, že elementy musí mít vždy prázdný obsah – nemůže již obsahovat žádné další elementy. Příkladem může být HTML tag <br>, který bychom mohli deklarovat pomocí

<!ELEMENT br EMPTY>

Pokud naopak nechceme obsah elementu nijak omezit, použijeme ANY. V praxi je však tato možnost využívána pouze zřídka, protože pak ztrácíme možnost pomocí DTD efektivně definovat přípustnou strukturu dokumentů. Využití nalezne snad jen při vývoji DTD pro potřeby ladění.

Nejčastěji se však v modelu obsahu vyskytují složitější konstrukce, které přesně určují použitelné elementy. Celá modelová skupina se pak musí uzavřít do závorek. Pokud mají elementy následovat v přesně stanoveném pořadí, oddělí se pomocí čárky. Tak tomu bylo v našem příkladě s fakturou. Pokud chceme určit, že má následovat pouze jeden z uvedených elementů, oddělíme je pomocí znaku `|'.

<!ELEMENT clanek (nazev, (autor|editor), odstavec+)>

Takto definovaný článek může obsahovat buď element autor nebo editor. Aby bylo vše jednoznačné, musíme používat závorky. Na stejné úrovni se nesmí vyskytnout elementy spojené pomocí čárky a `|'. Modelová skupina (nazev, autor | editor, odstavec+) je špatná, protože by parser nepochopil, jak jsme to mysleli.

Za každým elementem (nebo skupinou elementů v závorkách) v modelové skupině můžeme uvést znak, který určuje počet opakování. Pokud žádný nepoužijeme, musí se element vyskytnout právě jednou. Pokud je výskyt elementu nepovinný, připojíme ze jeho název `?'. Kdyby u článku bylo uvádění autora nepovinné, mohli bychom použít zápis

<!ELEMENT clanek (nazev, autor?, odstavec+)>

Pokud se element může vyskytovat libovolněkrát (i vůbec), používá se hvězdička. Kdyby mohl mít článek libovolný počet autorů, mohla by deklarace vypadat následovně

<!ELEMENT clanek (nazev, autor*, odstavec+)>

V ukázkách jsme použili znak `+'. Ten říká, že element se musí vyskytovat alespoň jednou. Vhodnou kombinací všech výše popsaných prostředků pak můžeme popsat i poměrně složité struktury.

Na určité úrovni je obsahem elementu již text, ne další elementy. V tomto případě použijeme v modelové skupině speciální text #PCDATA.

<!ELEMENT odstavec (#PCDATA)>

Častým případem je situace, kdy element může obsahovat jak další elementy, tak i přímo text. Této situaci se říká smíšený obsah a modelová skupina pak má speciální tvar.

<!ELEMENT odstavec (#PCDATA|tučně|kurzíva)*>

V elementu odstavec teď můžeme psát text a navíc používat dva elementy tučně a kurzíva.

© Jiří Kosek 2000-2001