XML-Know How

XML- und DOCTYPE-Deklaration

Ganz vollständig sind DTD und XML-Dokument in unserem Beispiel noch nicht. Was dem Dokument fehlt, ist zum einen die Angabe, dass es sich um ein XML-Dokument handelt und zum anderen die Information, dass es eine zugehörige DTD gibt. Dass es sich um XML handelt, gibt die XML-Deklaration an. Sie nimmt immer die erste Zeile des Dokuments ein und sieht wie folgt aus:

<?xml version="1.0" standalone="no" encoding="ISO-8859-1"?>

Die Versionsangabe ist zur Zeit (Stand: Okt. 2003) immer auf "1.0" festgelegt, aber es wird zukünftig weitere XML-Versionen geben. Daher darf diese Angabe nicht fehlen, sonst können später einmal Kompatibilitätsprobleme auftreten. standalone="no" bedeutet, dass das Dokument eine externe DTD hat, also nicht für sich allein steht, "yes" heißt entsprechend, dass es keine externe DTD gibt. Da dies auch aus der nachfolgenden DOCTYPE-Deklaration (s. u.) hervorgeht, ist die standalone-Angabe fakultativ. Diese Angabe veranlasst manche XML-Software, bei fehlender DTD eine Warnung auszugeben. Die Zeichenkodierungs-Angabe encoding="ISO-8859-1" teilt mit, dass die XML-Datei dem Code-Standard ISO-8859-1 entspricht. Fehlt die Angabe des Encoding, wird vorausgesetzt, dass die Datei in UNICODE nach UTF-8 kodiert ist. Auch eine DTD sollte mit einer XML-Deklaration beginnen, wobei hier die standalone-Angabe natürlich überflüssig ist.

Gibt es eine DTD für ein Dokument, muss diese der Verarbeitungssoftware bekanntgegeben werden. Dazu dient die DOCTYPE-Deklaration, die auf die XML-Deklaration folgt:

<!DOCTYPE buch SYSTEM "buch.dtd">

Nach dem Deklarationsaufruf !DOCTYPE findet sich die Angabe des Document Type. Das ist das oberste Element, also das Root-Element des betreffenden Dokumentes. Auf SYSTEM folgt die Angabe der DTD-Datei. Ist die Angabe ohne Pfad, muss die Datei im gleichen Verzeichnis liegen wie die XML-Datei. Es sind aber auch absolute und relative Pfadangaben erlaubt, ebenso eine URL, also eine Internet-Adresse. Daneben gibt es die Angabe "PUBLIC" anstelle von "SYSTEM":

<!DOCTYPE buch PUBLIC "+//ISBN 3-1234//BUCH100//DE" "buch.dtd">

PUBLIC steht hier für eine genormte Angabe des Eigentümers, des Projektes und der Sprache (public identifyer). Der public identifyer selbst folgt in Anführungszeichen, ihm schließt sich nach einem Leerzeichen wieder die Dateiangabe der DTD an (ohne die Zeichenfolge SYSTEM).

Der public identifyer soll es ermöglichen, beim Fehlen der DTD die Adresse des Eigentümers schnell ausfindig zu machen, um bei ihm nach der DTD für das betreffende Projekt nachfragen zu können.

Daneben besteht die Möglichkeit, in einer zusätzlichen Datei den public identifyer in einen Systempfad aufzulösen.

Das »+« im public identifyer bedeutet, dass die Eigentümerangabe qualifiziert ist, was meint, dass sie einem international eindeutigen Standard entspricht. Hier ist die Eigentümerangabe die Verlags-ISBN (also der Teil der ISBN, der den Verlag identifiziert). Man kann auch hier eine URL verwenden, da auch diese von einer internationalen Behörde (DENIC) so erfasst ist, dass man jederzeit Name und Adresse des Eigentümers erfahren kann:

<!DOCTYPE buch PUBLIC "+//www.verlag.de//BUCH100//DE" "buch.dtd">

Fehlt dem Eigentümer eine internationale Normadresse wie ISBN oder URL, ist die Adresse nicht qualifiziert, sie beginnt mit »-«:

<!DOCTYPE buch PUBLIC "-//Verlagsname//BUCH100//DE" "buch.dtd">

Es folgt die Angabe des Projektes ("BUCH100") und der Sprache ("DE" für Deutsch, entsprechend z. B. "EN" für Englisch). Diese festgelegte Form des public identifiers ist Bestandteil der SGML-Norm, wird aber auch in XML gerne verwendet. In XML kann man als identifier im Prinzip beliebige Zeichen, also auch direkt eine URL angeben, ohne dass das zu einer Fehlermeldung führen würde.

Die DTD muss auch nicht zwangsläufig als Datei in der DOCTYPE-Deklaration angegeben werden und separat gespeichert sein. Sie kann auch direkt in der DOCTYPE-Deklaration stehen (SYSTEM- und PUBLIC-Angaben sind dann selbstredend überflüssig). Die interne DTD wird dabei in eckige Klammern eingeschlossen:

<!DOCTYPE buch [
(hier steht die DTD)
]>

Auch die Mischung von interner und externer DTD ist möglich (im Fachjargon werden die Teil-DTDs dann internal und external subset genannt). In diesem Fall folgt das internal subset auf die übrigen Teile der DOCTYPE-Deklaration:

<!DOCTYPE buch PUBLIC "-//Verlagsname//BUCH100//DE" "buch.dtd"[
(hier steht die interne Teil-DTD [internal subset])
]>

Wenn die Deklaration ein und desselben Elements in beiden Subsets vorkommt, hat die Deklaration im internal subset Vorrang, d. h. sie alleine gilt, während die Deklaration im external subset ignoriert wird. So kann im Dokument selbst eine eventuelle Abweichung von der externen DTD festgelegt werden. Dieses Vorgehen sollte aber nur in Ausnahmefällen gewählt werden.

Die Speicherung der DTD in einer eigenen Datei ist auch aus Gründen der einfacheren Datenpflege die Regel: eine separate DTD, die für zahlreiche Dokumente gelten kann, muss so nur einmal zentral geändert werden; steht dagegen die DTD in vielen einzelnen XML-Dateien, müssen auch alle Exemplare einzeln gepflegt werden.