Article Index

Úvod

Document Type Definition (zkráceně DTD) představuje jednoduchý nástroj pro definici struktury XML souboru. Proč využívat definiční nástroje? Pokud si soulad značek a atributů hlídá aplikace, není zapotřebí se definičními nástroji zabývat. Problém je, pokud potřebujeme, aby náš datový XML soubor mohl zpracovávat software třetí strany. Pak narážíme na potřebu sdělit přesnou strukturu námi definovaného XML a případně doplnit omezení (výčtem položek, kritérii na základě srovnání hodnot čísel, …). Pak se nezbytné využít některý z dostupných standardů. Jedním z nich je právě DTD.

Vlastnosti DTD je prvním nástrojem, který byl dostupný pro definování značek, atributů a hierarchie v XML souboru. Co se omezení hodnot týká, není zde moc možností. Jediný nástroj zde představuje výčet povolených hodnot. Stejně tak je zde slabá možnost definovat počet výskytů stejné značky (například značka pro telefonní číslo může být použita pro jeden záznam opakovaně).

Vedlejším efektem použití definičního nástroje je možnost kontrolovat nejen jeho hierarchii, ale také hodnoty (pokud je podporováno). Nástroj se jmenuje parser a prochází soubor od začátku, a v případě detekce chyby zastaví parsování (činnost parseru při procházení souboru) a zobrazí chybovou hlášku. Je nutno mít na paměti, že obvykle se jedná o místo, kde se chyba projevila! Její skutečné umístění může být kdekoliv v předchozím kódu.

Syntaxe

První kroky Na rozdíl od jiných XML nástrojů, DTD nerespektuje XML standardy a má svůj vlastní zápis. Je možné jej také umístit na začátek XML souboru (obdoba CSS ve značce <head></head> v HTML souboru). Tato možnost vypadá následovně:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE zprava
[
<!ELEMENT zprava (komu,predmet,zprava)>
<!ELEMENT komu (#PCDATA)>
<!ELEMENT predmet (#PCDATA)>
<!ELEMENT zprava (#PCDATA)>

]> 
<zprava>
  <komu>Tove</komu>
  <predmet>Jani</predmet>
  <text>Reminder</text>
</zprava>

Co lze v souboru vidět? V prvním řádku je definice XML souboru, následuje sekce se zápisem DTD. Po jeho ukončení následuje již zápis XML. Tento způsob je málo využívaný – ze stejného důvodu, jako zápis CSS do hlavičky HTML.

Samostatný soubor Best practise v případě DTD je použití externího souboru. Definici pak lze využít pro všechny výskyty XML souboru s danou strukturou. V nejjednodušší verzi obsahuje pouze dvě definiční značky, které postačují pro popsání struktury XML souboru. 

Složky DTD:

  • <!ELEMENT jméno ()> - definujeme značku v hierarchické struktuře
  • <!ATTLIST jméno značka> - definujeme atribut pro vybranou značku

Vezměme následující XML soubor jako návrh datového formátu.
<zprava jazyk="cz">
  <komu>Tove</komu
  <predmet>Jani</predmet>
  <text>Reminder</text>
</zprava>

Pak DTD v hlavičce souboru vypadá následovně:
<!DOCTYPE zprava [
<!ELEMENT zprava (komu,predmet,zprava >
<!ELEMENT komu (#PCDATA)>
<!ELEMENT predmet (#PCDATA)>
<!ELEMENT zprava (#PCDATA)>
<!ATTLIST jazyk zprava CDATA #REQUIRED >
]>

Jak můžeme vidět, DTD popisuje hierarchii značek v XML souboru tím, že potomci jsou uvedeni v závorkách rodiče (tedy značky, v níž jsou uzavřeny). Pokud značka již nic neobsahuje, pak je v závorce uvedeno, jaká data jsou očekávána:

  • <!ELEMENT komu (#PCDATA)> - data budou procházet parsováním (nesmí obsahovat vybrané znaky – "<", ">", …)
  • <!ELEMENT komu (CDATA)> - data parsováním procházet nebudou (lze použít pro vložení například HTML kódu)

U definice atributu lze určit, zda je povinný nebo volitený:

  • <!ATTLIST jazyk zprava CDATA #REQUIRED> - atribut je povinný a musí být vyplněn
  • <!ATTLIST jazyk zprava CDATA #IMPLIED> - atribut je volitelný a nemusí být přítomen
  • <!ATTLIST jazyk zprava CDATA #FIXED "cz"> - atribut je nastaven na hodnotu "cz", musí být přítomen a musí obsahovat pouze hodnotu "cz"

Připojení DTD souboru k existujícímu XML souboru - umístění DTD na začátek XMl souboru je dobré při vývoji a ladění, nicméně DTD umístěné v každém souboru je nesmyslné a je nutné jej umístit do jednoho souboru - snadná údržba, aktualizace a zejména existence jediné verze.

Stačí přidat na začátek XML souboru následující řádek:

<!DOCTYPE kounikace SYSTEM "komunikace.dtd"> - pro případ, že DTD je naše vlastní

<!DOCTYPE sect1 PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"> - pro případ, že používáme veřejné DTD ("standardizované")