© aller Texte: msw 1999-2008
Was ist DTD?
DTD steht für Document Type Definition bzw. Document Type Declaration. In der DTD wird definiert, wie die XML-Tags in der Datei verwendet werden. In der DTD werden quasi die XML-Tags deklariert und der XML-Parser prüft, ob die Tags in der XML-Datei mit der Definiton in der DTD übereinstimmen. Stimmen diese nicht überein, wird ein Fehler gemeldet, ansonsten ist die XML-Datei korrket. Wird eine DTD verwendet, spricht man von einer gültigen XML-Datei (valid). Liegt keine DTD vor, spricht man von einer wohl-geformten XML-Datei (well-formed).

Die DTD wird in der XML-Datei im Prolog angegeben, direkt nach dem Tag <?xml?> über das Tag <!DOCTYPE>. Ein Beispiel:

<?xml version="1.0"?>

<!DOCTYPE Adresse [

<!ELEMENT Adresse (Name)>

<!ELEMENT Name (#PCDATA)>

]>

<Adresse>

<Name>Schwarz</Name>

</Adresse>

Die DTD wird eingeleitet über das Tag <!DOCTYPE>. Das Wurzelelement der XML-Datei ist <Adresse> und der Name der DTD muß nach der XML-Spezifikation ebenfalls Adresse sein. Der Name der DTD und der Name des Wurzelelements müssen identisch sein. Dann öffnet sich die eckige Klammer ( [ ). Jetzt werden die einzelnen Tags definiert.

Jedes Tag wird über das Tag <!ELEMENT> innerhalb der DTD angegeben. Zuerst wird das Tag <Adresse> definiert:

<!ELEMENT Adresse (Name)>

<Adresse> selbst besitzt ja ein Unter-Tag (<Name>). In Klammern wird nach der Definition von Adresse das Tags angegeben, das sich unterhalb von <Adresse> befindet. Dies ist <Name> und dieser Tagname wird hier angegeben. Anschließend wird das Tag <Name> definiert. Dies geschieht wieder über ein <!ELEMENT>-tag, gefolgt von dem zu definierenden Tagnamen. In Klammern steht hier jetzt aber etwas anderes: #PCDATA. Das Tag <Name> besitzt ja keine Unter-Tags mehr, sondern besitzt konkreten Inhalt, der aus Buchstaben besteht. Dieser Inhalt wird als PCDATA angegeben, dies steht für Parsed Character Data. Der XML-Parser prüft auch diese Informationen auf Korrektheit.

Wenn das Tag <Adresse> mehrere Unter-Tags besitzen soll (z.B. <Vorname>, <Nachanme>, <Strasse> usw.) müssen diese in der DTD angegeben werden:

<?xml version="1.0"?>

<!DOCTYPE Adresse [

<!ELEMENT Adresse (Nachname, Vorname, Strasse, PLZ, Ort, Telefon)>

<!ELEMENT Nachname (#PCDATA)>

<!ELEMENT Vorname (#PCDATA)>

<!ELEMENT Strasse (#PCDATA)>

<!ELEMENT PLZ (#PCDATA)>

<!ELEMENT Ort (#PCDATA)>

<!ELEMENT Telefon (#PCDATA)>

]>

<Adresse>

<Nachname>Schwarz</Nachname>

<Vorname>Sabine</Vorname>

<Strasse>Blauweg 4</Strasse>

<PLZ>53000</PLZ>

<Ort>Bonn</Ort>

<Telefon>0228-123456789</Telefon>

</Adresse>

Nachteile der DTD

Die DTD besitzt einen eklatanten Nachteil: es ist mit der DTD nicht möglich, den konkreten Inhalt eines Tags zu unterscheiden. Beispielsweise muß ein Tag, das die Telefonnummern speichert (<Telefon>), in der DTD als PCDATA deklariert werden:

<!ELEMENT Telefon (#PCDATA)>

Das Problem: PCDATA kann nicht zwischen Zahlen und normalen Buchstaben unterscheiden. Es ist nicht sinnvoll, in dem Tag <Telefon> Buchstaben einzugeben. Oder beispielsweise bei einem Tag <Geburtsdatum> kann dieses auch nur als PCDATA angegeben werden. Der XML-Parser kann nicht unterscheiden zwischen echten Geburtsdaten (z.B. <Geburtsdatum>19.01.1967</Geburtsdatum>) und falschen Daten (z.B. <Geburtsdatum>ab.cd.19ef</Geburtsdatum>).

Dieser Nachteil wurde auch vom W3-Konsortium erkannt. Dies führte zur Weiterentwickung der DTD, die unter dem Namen XML Schema geführt wird. XML Schema bietet die Möglichkeit, den Datentyp eines XML-Tags genau anzugeben. Dabei kann man zwischen normalen Buchstaben, Zahlen und sogar zwischen verschiedenen Wertebereichen der Zahlen unterscheiden.

Lernen Sie hier mehr über XML Schema!