XML: DTD – elementy

4. května 2000

Můžu již dnes využít XML? Není to nákladné? Nebudu mít nějaké problémy? A co tím vlastně získám? Na tyto otázky bych vám chtěl dát dnes odpovědi. Článek obsahuje i praktický příklad XML.

DTD (document type definiton – definice typu dokumentu) je důležitou součástí standardu XML 1.0. Přesně stanovuje strukturu XML dokumentu, který je podlé této definice vytvořen. Vytváření DTD již není tak jednoduché jako XML, a proto volím popis problematiky DTD do několika částí. Jako první na řadě jsou elementy.

Element

Element je základním stavebním prvkem XML dokumentu. Zjednodušeně lze říci, že XML dokument se skládá z elementů a jejich obsahů. Například zápis

<nazevkina>Galaxie</nazevkina>


znamená, že element nazevkina obsahuje text Galaxie. Další příklad

<adresa>
   <mesto>Praha</mesto>
   <ulice>Arkalycká 877/1</ulice>
</adresa>


znamená, že element adresa obsahuje element mesto a ulice. A ty už obsahují pouze text Praha a Arkalycká 877/1.

Jen pro úplnost uvádím, že zápis <nazevkina> je počáteční značkou (start-tag) elementu nazevkina a </nazevkina> je jeho ukončovací značkou (end-tag).

XML dokumenty jsou vytvářeny hlavně z toho důvodu, že v sobě obsahují data společně s jejich významem. Z dříve uvedeného příkladu pochopíme, že text Praha je město a text Arkalycká 877/1 je název ulice. A to celé je adresou.

Podívejte se na následující příklad:

<table>
   <tr>
      <td>Praha</td>
      <td>Arkalycká 877/1</td>
   </tr>
</table>


Co k němu můžeme říci? Určitě odpovídá pravidlům tvorby XML dokumentu (musí existovat ke každé počáteční značce značka koncová, značky se nesmí křížit atd.). Lze tedy tento příklad považovat za část XML dokumentu. Ten, kdo zná HTML přidá: to je tabulka o jednom řádku a dvou sloupcích, kde v prvním sloupci je Praha a v druhém Arkalycká 877/1. Ano i to je pravda, ale pouze v tom případě, že tento dokument je určen pro prohlížeč. Rozhodně nám, ale neřekne nic o tom, co je text Praha (Je to název města nebo název kina?) nebo text Arkalycká 877/1 (u něho je to jednodušší, neboť si to dokážeme domyslet). Kam tím vším směřuji? K tomuto: „Názvy elementů by měly korespondovat se svým obsahem a nikoliv s jejich použitím“. Pokud se této zásady řídit nebudete, skončíte se spoustou XML dokumentů, které budou k ničemu! Můžete je sice ihned zobrazit (jako v našem případě), ale je těžké je použít jako zdroj dat.

Dalším nebezpečím, které na nás v XML číhá, je – paradoxně – v jeho největší výhodě, a tou je jeho rozšiřitelnost. Představte si, že jste ve firmě kompletně přešli na XML. Každý teď vytváří XML dokumenty a vše vypadá skvěle. A kde je to nebezpečí? Zeptám se: Jaká je šance, že všichni, kteří vytvářejí stejné dokumenty (například pravidelné týdenní zprávy svému vedoucímu), vymyslí shodné názvy elementů a shodně je v těchto dokumentech použijí? Troufám si tvrdit, že hodně malá. Je to úplně stejné, jako v případě neexistence šablon textových editorů. Za chvíli zjistíte, že co zaměstnanec to originální řešení. V textových editorech tomu uděláte přítrž zavedením šablon, ale co v XML? V XML se k tomu použije právě DTD. Pozor! DTD není přímo šablonou XML dokumentu. DTD (definice typu dokumentu) obsahuje popis všech elementů, které mohu použít, včetně předpisu, jak je mohu použít, kde je mám použít a jaké mohou mít atributy.

V tomto článku si probereme definici elementů. Ta má v DTD tento tvar:

<!ELEMENT název_elementu obsah_elementu >

Názvy elementů

Kromě výstižného názvu elementu musíme vytvářet názvy i s ohledem na standard XML 1.0. Ten je k názvům elementu velkorysý. Umožňuje použít znaky abecedy (včetně diakritiky), číslice (0 až 9) a navíc „.“ (tečku), „-“ (pomlčku), „_“ (podtržítko) a „:“ (dvojtečku). Bohužel i trochu omezuje. Prvním omezením je to, že název elementu může začínat pouze znakem abecedy nebo „_“ (podtržítkem) nebo „:“ (dvojtečkou). Druhým omezením je to, že nesmí začínat na xml (Xml, xMl, XML atd). Názvy elementu začínající na xml jsou vyhrazeny pro potřeby budoucího rozšíření standardu XML.

poznámka: Nedoporučuji v názvech elementů používat dvojtečku. Je totiž použita v dalších standardech postavených nad XML, konkrétně v Namespaces in XML, kde odděluje namespace od názvu elementu. Mohli by jste mít pak problémy.

Příklad správných názvů:

<?xml version=“1.0″ encoding=“windows-1250″?>
<!DOCTYPE test [
   <!ELEMENT test ANY>
   <!ELEMENT adresa (#PCDATA)>
   <!ELEMENT město (#PCDATA)>
   <!ELEMENT adresa-ulice (#PCDATA)>
   <!ELEMENT _ičo (#PCDATA)>
   <!ELEMENT Adresa_2.ulice-číslo-domu (#PCDATA)>
]>
<test>
   <adresa/>
   <město/>
   <adresa-ulice/>
   <_ičo/>
   <Adresa_2.ulice-číslo-domu/>
</test>

Příklad špatných názvů elementů:

<?xml version=“1.0″ encoding=“windows-1250″?>
<!DOCTYPE test [
   <<!ELEMENT .test ANY>
   <<!ELEMENT -adresa (#PCDATA)>
   <<!ELEMENT 0město (#PCDATA)>
   <<!ELEMENT adresa ulice (#PCDATA)>
]>
<.test>
   <<-adresa/>
   <<0město/>
   <<adresa ulice/>
</.test>


V příkladech používám DTD uvnitř XML dokumentu. Jedná se o zápis:

<!DOCTYPE root_element [
… definice elementů
]>
<root_element>
… obsah
</root_element>

Je to jeden z možných způsobů napojení DTD do XML dokumentu. Není příliš vhodný pro praxi, ale pro potřeby tohoto článku je to dostačující. V některé další části se dozvíme další způsoby.

Obsah elementů

Celkem rozeznáváme 4 typy obsahů elementů:

EMPTYprázdný obsah
ANYjakýkoliv element
Mixedsmíšený (může obsahovat text a elementy)
childrenpouze vyjmenované elementy

Elemnt Empty

Element, který je definován jako EMPTY (prázdný) nesmí obsahovat nic. Ani text.

Příklad:

<?xml version=“1.0″ encoding=“windows-1250″?>
<!DOCTYPE test [
   <!ELEMENT test ANY>
   <!ELEMENT opatrný-provoz EMPTY>
]>
<test>
   <opatrný-provoz/>
   <opatrný-provoz></opatrný-provoz>
</test>


Z příkladu je vidět, že prázdný element lze zapsat dvěma způsoby. Důležité je, že v druhém způsobu není nic mezi počáteční a koncovou značkou. V opačném případě není zápis platný (i kdyby mezi nimi byla pouze jedna mezera).

Prázdné elementy se používají hlavně k signalizaci některých stavů, nebo v elementech, u kterých je obsah zapsán pouze do atributů.

Element ANY

Element s obsahem ANY může obsahovat jakýkoliv element, který je definován (je tedy v DTD). Nezáleží ani na počtu a pořadí těchto elementů.

příklad: viz příklad správných názvů elementů

Element Mixed

Do elementu s tímto obsahem lze zapisovat text nebo text smíchaný s určitými elementy. U těchto elementů nelze ovlivnit pořadí ani jejich počet.

<?xml version=“1.0″ encoding=“windows-1250″?>
<!DOCTYPE test [
   <!ELEMENT test ANY>
   <!ELEMENT pouze-text (#PCDATA)>
   <!ELEMENT text-s-elementy (#PCDATA | elm1 | elm2 )*>
   <!ELEMENT elm1 (#PCDATA)>
   <!ELEMENT elm2 (#PCDATA)>

]>
<test>
   <pouze-text>Zde můžu pouze text!</pouze-text>
   <text-s-elementy>
      Zde můžu text tak i <elm1>elementy</elm1> a to v jakémkoliv <elm2>pořadí</elm2> a <elm1>počtu</elm1>
   </text-s-elementy>
   <text-s-elementy></text-s-elementy>
</test>

Uvedením (#PCDATA) do definice obsahu elementu určíme, že element může obsahovat pouze text. Zápis (#PCDATA | elm1 | elm2 )* znamená: obsah elementu může být text nebo element elm1 nebo elm2 a to celé se může vyskytovat několikrát nebo vůbec ne. Toto je určené znakem „*“ (hvězdička) za uzavírací závorkou. Při smíšeném obsahu textu s elementy je znak „*“ povinný.

Bohužel, toto jsou jediné dva způsoby pro definování smíšeného obsahu! Buď text, nebo text s elementy.

Element children

Elementy s obsahem children mohou obsahovat pouze další elementy. Typ obsahu elementu children je nejrozšířenější způsob definování obsahu elementů.

V tomto obsahu lze kombinovat dva způsoby zápisu obsahu: výběrový (choice) a sekvenční (sequence).

Příklad výběrového obsahu:

<!ELEMENT složka ( dokument | odkaz | obrázek )>


Tento zápis znamená, že element složka musí obsahovat buď element dokument, element odkaz nebo element obrázek. To nám zajišťuje znak „|“, který je vlastně logické „nebo“ (OR).

Příklad sekvenčního obsahu:

<!ELEMENT adresa ( město, ulice, okres)>


Tento zápis znamená, že element adresa musí obsahovat elementy město, ulice a okres přesně v uvedeném pořadí. Zde je důležitý znak „,“ (čárka), který je vlastně logickým „a“ (AND).

Všimněte si slova „musí“. Proč? Protože celý výběr neobsahuje žádnou dodatečnou volbu počtu opakování. Ta se může vyskytovat jak u samotných elementů, tak i u celé skupiny (ohraničené závorkami). Pro elementy (a skupiny), u kterých není volba uvedena platí, že se musí vyskytovat pouze jednou.

Tabulka voleb počtu opakování:

žádný znakjeden výskyt
*0 nebo více
?0 nebo 1
+1 nebo více

Příklad zápisu s uvedením volby počtu opakování:

<!ELEMENT složka ( dokument | odkaz | obrázek )*>
<!ELEMENT adresa ( město, ulice+, okres)>
<!ELEMENT hlavní-složka ( složka+, odkaz*, info?)>


Element složka může obsahovat elementy dokument nebo odkaz nebo obrázek a to několikrát nebo vůbec ne.

Element adresa musí obsahovat jeden element město, jeden nebo více elementů ulice a jeden element okres a to v uvedeném pořadí.

Element hlavní-složka musí obsahovat jeden nebo více elementů složka, žádný nebo několik elementů odkaz a žádný nebo jeden element info a to v uvedeném pořadí.

Jak jsem se dříve zmínil, lze výběrové a sekvenční obsahy kombinovat:

Příklad:

<!ELEMENT adresa ( město, ( pobox | ulice )?, okres)>
<!ELEMENT osoba ( (jméno, RČ) | id-průkaz+ | (otisk-palce, fotka) )>


V elementu adresa může být místo elementu ulice uveden pobox nebo nic (viz „?“).

Osoba může být evidována pod jménem a RČ nebo podle dostupných identifikačních průkazů (minimálně jednoho) nebo podle otisku palce společně s fotkou.

Kombinace nejsou ničím omezeny. Ani počtem vnoření.

Závěr

Vytváření DTD již vyžaduje trochu větší znalosti, než pouhá pravidla zápisu v XML dokumentu. XML ani přímo nevyžaduje, aby XML dokument byl vytvořen podle nějakého DTD. Díky tomu se velmi rychle šíří (naproti tomu SGML, z kterého XML vychází, DTD požaduje – a proto se také moc nerozšířilo). Ovšem jsou situace, kdy byste chtěli, aby vytvářený XML dokument odpovídal určitým pravidlům. Není těžké si takové situace představit: program zpracovávající XML dokument, zobrazování XML dokumentu, transformace XML dokumentu na jiný XML dokument, vyhledávání atd.. DTD je v současnosti prakticky jedinou možností jak toho docílit. Pro úplnost uvedu, že XML dokument, který je vytvořen podle nějakého DTD a prošel automatickou kontrolou, jak na samotnou syntaxi XML (tím se ověří, že je správně vytvořen – well formed) tak i na pravidla uvedená v DTD, se nazývá „platným dokumentem“ (valid document).

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *