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