DTD – Document Type Definition Tutorial

dtd document type definition tutorialIn diesem dritten Teil des XML Tutorials geht es, nach dem wir uns zuvor allgemein XML Datenmodelle angeschaut haben, konkret um ein Datenmodell, nämlich DTD. Eine Document Type Definition (DTD) ist eine schematische Beschreibung von XML-Dokumenten, definiert also eine bestimmte Klasse von Dokumenten, die vom gleichen Typ sind. Dafür legt sie verbindlich das Vokabular und die Grammatik für die Auszeichnungssprache in ihrer eigenen Syntax fest.

Eingebunden werden kann die DTD entweder intern als auch extern, wie man das beispielsweise von einer CSS-Datei in HTML kennt. Bei einer internen DTD folgt die DTD gleich nach der Dokumenttyp-Deklaration, wobei die gesamte DTD durch eckige Klammern eingeschlossen ist. Bei einer externen DTD wird die DTD hingegen aus dem XML-Dokument ausgegliedert und in einer eigenen Datei abgespeichert. Man verwendet dafür üblicherweise die Dateierweiterung .dtd. Anschließend wird innerhalb des XML-Dokuments auf diese .dtd Datei hingewiesen.

Erfüllt ein Dokument die durch ein DTD aufgestellte Struktur, dann spricht man davon, dass das Dokument gültig (valid) ist. Während die Wohlgeformtheit von XML vorgeschrieben wird, ist die Validität eine optionale Eigenschaft.

Im Gegensatz zu XML Schema ist man mit DTD deutlich limitierter. Es sind nur einfache Datentypen möglich, Namensräume werde nicht unterstützt und allgemein sind keine komplexe Strukturen möglich.
Formal gesehen ist DTD eine Grammatik, die sowohl Elementypen als auch Attributtypen definiert. Dies geschieht folgendermaßen:

Inhalt

Elementtypen

Syntax – Definition:

<!ELEMENT elementname (inhalt)>

Regeln:

  • Groß- und Kleinschreibung wird unterschieden (case-sensitiv)
  • Name muss mit einem Buchstaben oder Unterstrich beginnen
  • Zeichenfolge „xml“ ist reserviert und darf nicht am Anfang stehen!

Beispiel

<!ELEMENT tutorial (bezeichnung?, dauer*, schwierigkeitsstufe*)>
<!ELEMENT bezeichnung (#PCDATA)>
<!ELEMENT dauer (#PCDATA)>
<!ELEMENT schwierigkeitsstufe (#PCDATA)>
...
<tutorial>
	<bezeichnung>XML Tutorial</bezeichnung>
	<dauer>30 Minuten</dauer>
	<schwierigkeitsstufe>Einfach</schwierigkeitsstufe>
</tutorial>

Erklärung:

Elemente können aus einer Sequenz von Elementen (ElementA, Element B, ..) oder einer Alternativen von Elementen (ElementA|Element B|…) bestehen. Das Zeichen (?,+,*) hinter dem Element gibt die Wiederholung an, wobei

  • Element? – Element kommt höchstens einmal vor
  • Element+ – Element kommt mindestens einmal vor
  • Element* – Element kommt beliebig oft vor (auch gar nicht möglich)

bedeutet. Im oberen Beispiel kommen die Elemente Bezeichnung, Dauer und Schwierigkeitsstufe vor. Wobei davon ausgegangen wird, dass es immer nur ein Tutorial unter der gleichen Bezeichnung gibt (deshalb bezeichnung?), während die anderen Elemente gar nicht oder beliebig oft vorkommen (umso mehr Tutorials, umso häufiger wird auch die gleiche Schwierigkeitsstufe bzw. Dauer vorliegen). Wichtig an dieser Stelle ich noch einmal darauf hinzuweisen, dass die Reihenfolge, wie sie in tutorial angegeben worden ist, zwingend eingehalten werden muss. Es folgt also immer erst das Kindelement bezeichnung, dann die dauer und ganz zum Schluss die schwierigkeitsstufe. Würde die dauer vor der bezeichnung stehen, wäre das XML-Dokument nicht valide und der Parser würde meckern.

Das #PCDATA steht für parsed character data und ist einfach ein Schlüsselwort für einen Textblock (reiner Text ohne Markup). Genutzt wird PCDATA für gemischte Inhalte des Dokuments, diese können also auch andere Elemente oder Textblöcke enthalten. #PCDATA ist übrigens der einzige Datentyp für ein Element. Man kann nicht noch weiter einschränken, in dem man beispielsweise nur Zahlen, nur eine bestimmte maximal Zeichenlänge oder auch nur ein Datum erlauben möchte. Dafür muss man auf XML Schema zurückgreifen.

Attributtypen

Syntax – Definition:

<!ATTLIST elementname Attribut1 Attributtyp1 Default1 ... Attributk Attributypk Defaultk>

Der Attributname darf ebenfalls nur nach den Regeln vergeben werden, die man von den Elementnamen kennt (Name muss mit Buchstabe, Unterstrich oder Doppelpunkt anfangen, xml darf nicht am Anfang stehen, es wird zwischen Groß- und Kleinschreibung unterschieden). Im Gegensatz zu den Elementen lassen sich aber mehrere Attributtypen vergeben. So gibt es zehn grundlegende Typen für Attribute:

  • CDATA – Zeichenkette ohne Markups
  • NMTOKEN – Namensymbole (Folge von Buchstaben, Zahlen, bestimmte Sonderzeichen, keine Leerzeichen)
  • NMTOKENS – Liste von Namensymbolen, getrennt durch Leerzeichen
  • NOTATION – Verweis auf eine Notation, z.B. Name für Nicht-XML -Format
  • ID – Eindeutiger Identifizierungswert, darf nur einmal im XML Dokument vorkommen
  • IDREF – Verweis (Referenz) auf Attribute des Typs ID
  • IDREFS – Liste von Referenzen
  • ENTITY – Name einer in der DTD deklarierten nicht geparsten Entität, Ähnlich einer Variablen bei Programmiersprachen
  • ENTITIES – Liste von Entitäten (mit Leerzeichen getrennt)
  • Aufzählung – Liste von Werten, von denen einer als Attributwert verwendet werden muss

Darüber hinaus kann man angeben, ob Attribute immer auftreten müssen oder optional sind. Dafür stehen folgende Vorgabedeklarationen zur Verfügung:

  • #IMPLIED – Das Attribut kann im Element fehlen, falls es eingesetzt wird, gibt es kein Vorgabewert dafür
  • #REQUIRED – Attribut muss auf jeden Fall im Element vorkommen, es gibt aber kein Vorgabewert
  • #FIXED – Der angegebene Wert gilt, falls ein anderer Wert im Attribut auftritt ist dies ein Fehler

Ein Beispiel für unsere Tutorials:

<!ATTLIST tutorial
	schwierigkeitsstufe (Leicht|Mittel|Schwer) #REQUIRED
	sprache NMTOKEN #FIXED "DE"
>

Das bedeutet, dass unser Element tutorial zwei Attribute hat (die beide auch zwingend genutzt werden müssen), wobei das Attribut entweder die Schwierigkeitsstufe, Leicht, Mittel oder Schwer haben kann, während das Attribut Sprache nur den Inhalt „DE“ erlaubt. Nachfolgend einmal die gesamte DTD und eine mögliche Dokumentinstanz:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tutorial [
<!ELEMENT tutorial  (#PCDATA)>
<!ATTLIST tutorial
	schwierigkeitsstufe (Leicht|Mittel|Schwer) #REQUIRED
	sprache NMTOKEN #FIXED "DE"
> ]>

 <tutorial schwierigkeitsstufe="Mittel" sprache="DE">JavaScript Tutorial</tutorial>

Weiter geht’s

Nach dem wir uns hier mit DTD auseinandergesetzt haben, folgt im weiteren Teil nun das zweite XML-Datenmodell, nämlich XML Schema. Falls noch Fragen oder Anmerkungen zur DTD vorhanden sind, freue ich mich natürlich auf deinen Kommentar. Ansonsten geht es hier nun weiter mit dem XML Schema Tutorial.

3 Gedanken zu „DTD – Document Type Definition Tutorial“

Schreibe einen Kommentar