A Document Type Definition

Egy dokumentum helyes (valid), ha megfelel egy DTD (Document Type Definition)-ben leírt szabályoknak. A DTD feladata, hogy megadja az XML dokumentum lehetséges felépítését.

A DTD-t lehet az XML dokumentumon belül, vagy kívül is deklarálni. Amennyiben belül deklaráljuk, a formátuma az alábbi:


<!DOCTYPE root-element [element-declarations]>

Egy példa a belső DTD létrehozásra:


<?xml version="1.0" encoding="ISO-8859-2"?>
<!DOCTYPE note [
  <!ELEMENT note (to,from,heading,body)>
  <!ELEMENT to      (#PCDATA)>
  <!ELEMENT from    (#PCDATA)>
  <!ELEMENT heading (#PCDATA)>
  <!ELEMENT body    (#PCDATA)>
]>
<note>
  <to>Peti</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Menjünk bringázni a hétvégén</body>
</note>

A DTD deklaráció azt mondja, hogy a gyökér elem a note lesz, aki 4 gyerek elemet tartalmaz, és ezen gyerekelemek mindegyikének típusa #PCDATA.

Amennyiben külső DTD-t alkalmazunk, akkor a deklaráció alakja:


<!DOCTYPE root-element SYSTEM "filename">

ahol a filename annak a külő állománynak a neve, amiben a DTD-nk van.

Példa külső DTD létrehozására:


<?xml version="1.0" encoding="ISO-8859-2"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Peti</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Menjünk bringázni a hétvégén</body>
</note>

A note.dtd tartalma pedig:


<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

Nyilvánvalóan egy külső DTD sokkal rugalmasabb, hiszen XML állományok, sőt, fejlesztő csoportok között is biztosítja ugyanannak a sémának a használatát.


<!ENTITY entity-name SYSTEM "URI/URL">


<!ENTITY writer SYSTEM "http://www.w3schools.com/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3schools.com/entities.dtd">

Néhány karakter speciális jelentéssel bír az XML-ben, mint pl. a & <. Ezeket nevezzük entitásoknak (entity). Az alapvető entitások az alábbiak:


&amp;	&	ampersand
&lt;	<	less than
&gt;	>	greater than
&apos;	'	apostrophe
&quot;	"	quotation mark

A PCDATA jelentése: Parsed character data. A PCDATA-t az XML parszer átvizsgálja, és pl. markup-okat és entity-ket keres benne. Ha ilyet talál, azokat kifejti. Éppen ezért PCDATA nem tartalmazhat olyan karaktereket, mint pl. & < stb., ezeket a megfelelő &amp; &lt; entitásokkal kell helyettesíteni.

A CDATA jelentése: (nem parszolt) Character data. Ilyen szövegen belül az XML parszer nem keres entitásokat és nem végez kifejtéseket. A CDATA tartalmat a <![CDATA[ karaktersorozat nyitja, és a ]]> sorozat zárja.


    Ide bármit írhatok, pl: & > <!-- 
    több soron keresztül

A DTD-ben alkalmazhatunk a reguláris kifejezésekhez hasonlatos operátorokat is:


     ,  az elemek relatív sorrendjét írja le 

     |  választás több megengedett elem közül

     ?  legfeljebb egyszer megjelenő tartalom

     +  legalább egyszer megjelenő tartalom

     *   a tartalom opcionális, de egynél többször is előfordulhat

Üres elemek


<!ELEMENT element-name EMPTY>
Example:
<!ELEMENT br EMPTY>
XML example:
<br />

Csak parszolt karakter adat:


<!ELEMENT element-name (#PCDATA)>
Example:
<!ELEMENT from (#PCDATA)>


<!ELEMENT element-name ANY>
Example:
<!ELEMENT note ANY>

Néhány példa:


<!ELEMENT element-name (child1)>
or
<!ELEMENT element-name (child1,child2,...)>
Example:
<!ELEMENT note (to,from,heading,body)>

<!ELEMENT element-name (child-name?)>
Example:
<!ELEMENT note (message?)>

Example:
<!ELEMENT note (#PCDATA|to|from|header|message)*>

<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to      (#PCDATA)>
<!ELEMENT from    (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body    (#PCDATA)>


Az attributumokat is lehet definiálni:


<!ATTLIST element-name attribute-name attribute-type default-value>
DTD example:
<!ATTLIST payment type CDATA "check">
XML example:
<payment type="check" />


value	        The default value of the attribute
#REQUIRED	    The attribute is required
#IMPLIED	    The attribute is not required
#FIXED value	The attribute value is fixed

Az attribútum típusok lehetséges értékei:


CDATA	        The value is character data
(en1|en2|..)	The value must be one from an enumerated list
ID	            The value is a unique id 
IDREF	        The value is the id of another element
IDREFS	        The value is a list of other ids
NMTOKEN	        The value is a valid XML name
NMTOKENS	    The value is a list of valid XML names
ENTITY	        The value is an entity 
ENTITIES	    The value is a list of entities
NOTATION	    The value is a name of a notation
xml:	        The value is a predefined xml value

Példa default értékre:


DTD:
<!ELEMENT square EMPTY>
<!ATTLIST square width CDATA "0">
Valid XML:
<square width="100" />

Kötelező érték:


TD:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
Valid XML:
<sender company="Microsoft" />
Invalid XML:
<sender company="W3Schools" />

Értékek listája:


DTD:
<!ATTLIST payment type (check|cash) "cash">
XML example:
<payment type="check" />
or
<payment type="cash" />