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:
& & ampersand < < less than > > greater than ' ' apostrophe " " 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ő & < 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" />