| 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!
|