A DTD (Document Type Definition) feladata
A DTD annyiban hasonlít az XSL-hez, hogy az XML fájlban szereplő adatok típusát és viselkedését határozza meg. Szabályok összessége, melyek az XML dokumentum teljes szerkezetét leírják.
Állhat külön fájlban és lehet az XML dokumentum elején is. Speciális esetekben előfordulhat a kettő keveréke. Különálló DTD-nek előnye, hogy több XML dokumentumhoz is használható, ami nem elhanyagolható, figyelembe véve a sokszor időigényes elkészítését. Ha a dokumentumba épül be, akkor nincs szükség több fájlra, de kívülről más XML fájlokból nem használható. Ugyanazt a belső DTD-t átmásolhatjuk más dokumentumba is, de változás esetén az összes példányt módosítani kell. Ennek okán inkább külsőt szokás használni. Ha egy XML fájlban is szerepel külső és belső is, akkor az utóbbi felülírja a külső definíciókat.
A DTD határozza meg például, hogy egy adatot kötelező-e megadni, milyen intervallumban szerepelhet, lehet-e ismétlődő, stb. Programozók számára különösen előnyös, mert nem kell programjaikban ellenőrizni a bevitt adatok helyességét, ugyanis nem várt adatok eleve nem juthatnak el az alkalmazásig.
Minden DTD elemhez komplett stílusokat leíró szabályok rendelhetők. Elég egyszer elkészíteni a DTD-t, kiosztani a munkatársaknak és biztosítható, hogy mindig megfelelő adatokat, a megfelelő formában fogják beírni. Természetesen csak programozási eszközökkel leírható helyesség ellenőrzést készíthetünk, magának az információnak a tartalmi helyességét nem lehet ellenőrizni.
Fontos megemlíteni, hogy DTD-t nem kötelező készíteni.
Szintaxis
A DTD deklarációkat tartalmaz. Minden deklaráció <!....!> jelek között szerepel. Például:
<!ENTITY % Propagated "PROPAGATED (true|false) 'false'">
<!ENTITY % SuperClass "SUPERCLASS CDATA #IMPLIED">
<!ENTITY % ClassName "CLASSNAME CDATA #REQUIRED">
<!ELEMENT DECLARATION (DECLGROUP|DECLGROUP.WITHNAME|DECLGROUP.WITHPATH)*>
<!ATTLIST CIM
CIMVERSION CDATA #REQUIRED
DTDVERSION CDATA #REQUIRED>
A fenti sorok a Windows XP %systemroot% \ system32 \ wbem \ xml \ wmi32.dtd fájlból származnak és egy kivételével tartalmazzák az összes felhasználható kulcsszót:
- ATTLIST = jellemző meghatározás
- ENTITY = egyed meghatározás
- ELEMENT = jelölőelem meghatározás
- NOTATION = nem XML adattípus meghatározás
ATTLIST
Kezdjük az ATTLIST paranccsal:
Neve az Attributum List (~jellemző lista, jellemzők listája) szavak összevonásából keletkezett. Mint a neve is utal rá, egy adott elemhez tartozó összes jellemzőt egyetlen listában adhatunk meg. A lista annak az elemnek a nevével indul, melynek a jellemzőiről szó van:
<!ATTLIST book ...
.......................>
Ezt követően kell felsorolni az egyes jellemzőket és típusaikat:
<!ATTLIST book cim CDATA
szerzo CDATA
kiadas ENTITY
sorszam ID>
A típusok a következő lehetnek:
- CDATA = egyszerű karakterlánc (<cim="Windows Software Online">)
- NMTOKEN és NMTOKENS = egy (vagy több) szó vagy token (<valami="15abc">)
- ENTITY és ENTITIES = egyedhivatkozás(ok)
- ID és IDREF és IDREFS = speciális kapcsolódást meghatározó tulajdonságok (lásd egy későbbi részben)
- NOTATION = meghatározza, hogy mely adattípusok ágyazhatók be az elembe.
Ha kötelező egy adatot megadni, akkor a #REQUIRED kulcsszóval zárjuk a deklarációt:
<!ATTLIST fajlnev CDATA #REQUIRED>
ELEMENT
Az ELEMENT kulcsszó egy új jelölőelemet és lehetséges tartalmát írja elő. Ha a jelölőelemben nem szerepelhetnek más jelölőelemek és szöveg sem, akkor az EMPTY (üres) kulcsszóval deklaráljuk:
Az XML-ben ez így jelenik meg:
<fejezet>Az alábbi képen látható a hátpikkelyes, tükrös nemesponty.<kep ../></fejezet>
vagy
<fejezet>Az alábbi képen látható a hátpikkelyes, tükrös nemesponty.<kep fájlnev="c:\ponty1.jpg"/></fejezet>
Az elem tartalmazhat gyermekelemet vagy szöveget, ekkor már nem üres elemnek nevezzük. Ha bármit tartalmazhat, az ANY kifejezést használjuk a deklarációban?
Szöveget tartalmazó elemeket a (#PCDATA) kifejezéssel kell deklarálni:
Nézzük meg a következő példát:
<!ELEMENT konyv (cim+, fejezet*, bekezdes?)>
A * karakter jelentése, hogy az adott elem ismételhető és választható is, a + jelé, hogy ismételhető és szükséges, a ?, hogy választható, de nem ismételhető
NOTATION
Nem XML típusú adatok beágyazását teszi lehetővé.
<!NOTATION MySpecialText SYSTEM "c:\MyTextViewer">
A "MySpecialText" az elem neve, a SYSTEM kulcsszó után, pedig a feldolgozására képes alkalmazás szerepel. Természetesen ennek elérhetőnek és futtathatónak kell lenni, ami az Interneten nem igazán alkalmazható.
ENTITY
Az ENTITY egy speciális típusú egyedhivatkozás