XML Grundlegendes

Es gibt zwei Kriterien nach denen man XML-Dokumente bewerten kann:

1.Wohlgeformtheit (wellformedness): Ja ja, mir ist schon klar, was die überwiegende Mehrzahl der (männlichen) Leser jetzt denken wird, aber es geht hier nicht um weiche Rundungen oder ähnliches. Gemeint ist, daß ein wohlgeformtes XML-Dokument die Regeln des Standards befolgt, also beispielsweise < und > richtig benutzt und die Elemente korrekt geschachtelt sind. Korrekte Schachtelung bedeutet, daß, wenn das Start-Tag innerhalb eines Elements ist, auch das End-Tag in diesem Element enthalten sein muß. Folgendes ist also nicht wohlgeformt:

<fett>Das ist <kursiv> völlig </fett>
            falsch! </kursiv>

2.Gültigkeit (validity): Ein wohlgeformtes XML-Dokument wird als gültig oder valide bezeichnet, wenn es den Regeln einer DTD folgt. Ein Dokument kann also wohlgeformt und nicht gültig sein, aber niemals gültig und nicht wohlgeformt. Außerdem ergibt sich, daß ein Dokument immer nur bezüglich einer DTD, und nicht von sich aus gültig sein kann.

Jeder der schon mal etwas programmiert hat, und sich seine Quelltexte nach einiger Zeit mal wieder anschaut (bei mir reichen da manchmal schon ein paar Tage), weiß, wie wichtig Kommentare sind. Natürlich gibt es diese auch in XML, und wer schon mal HTML geschrieben hat, dem wird die Syntax sehr bekannt vorkommen, denn es ist die gleiche.

<!--Kommentar-->

Kommentare können allerdings nicht innerhalb anderer Tags stehen:

<myElement <!--Kommentar--> > <!--total daneben!!!-->

Genug der langen Vorrede, beginnen wir mal ein XML-Dokument zu schreiben. Ein solches Dokument besteht aus 2 Teilen: dem Prolog und den eigentlichen Elementen. Der Prolog sollte zumindest aus der Zeile

<?xml version="1.0"?>

bestehen, kann aber auch leer sein. Sollen noch Informationen über die Codierung des Textes hinzukommen, kann die erste Zeile auch so aussehen:

<?xml version="1.0" encoding="UTF-8"?>

Nun sollte die DTD folgen, muß aber nicht. Es ist zum Beispiel nicht eben praktisch, erst eine DTD und dann ein XML-Dokument zu schreiben, wenn man sowieso nur ein einziges Dokument diesen Dokumenttyps plant. Die DTD dient ja quasi als Schablone nach deren Muster man dann die XML-Dokumente baut.
Es gibt zwei Möglichkeiten eine DTD in ein XML-Dokument einzubinden. Bei der internen DTD befinden sich DTD und XML-Dokument in einer Datei.

<?xml version="1.0"?>
<!DOCTYPE foo [
    <!ELEMENT myElement (#PCDATA)>
]>

Nach dem [ folgt hier schon die Definition eines Elementes. Ignoriert einfach, daß ihr das noch nicht schnallt, was da steht. Ich werde zu einem späteren Zeitpunkt darauf zurück kommen. Grundsätzlich gilt die Regel, daß der Name, der in der Dokumenttypdeklaration auftaucht, also in diesem Fall foo, der des Wurzelelementes sein muß. Das Wurzelelement ist ein Tag, der alle anderen Tags enthält (mehr dazu im nächsten Kapitel).

Bei einer externen DTD befinden sich DTD und XML-Dokument in getrennten Dateien, was bei großen Dokumenten durchaus praktisch ist. Das XML-Dokument enthält dann nur einen Verweis auf die DTD.

<?xml version="1.0">
<!DOCTYPE foo SYSTEM "foo.dtd">

In diesem Fall würde ein XML-Parser in einer Datei namens foo.dtd nach einer DTD suchen. In dieser Datei müßte dann genau das gleiche stehen, wie im Beispiel für die interne DTD hinter dem [.

Beide Formen können auch gemischt vorkommen:

<?xml version="1.0"?>
<!DOCTYPE foo SYSTEM "foo.dtd" [ <!ELEMENT myELEMENT (#PCDATA)>
]>

Der Parser wird an dieser Stelle beide DTD's zusammenfassen, und als eine behandeln. Dabei gilt die Regel, daß die interne DTD zuerst eingelesen wird. Bei Mehrfachdeklarationen ist immer die gültig, die zuerst eingelesen wurde, also die interne. Im obigen Beispiel würde also das Element myElement aus der internen DTD das Element myElement aus der externen DTD überlagern. Was das bedeutet? Der Nutzer einer (möglicherweise fremden) DTD hat die Möglichkeit diese DTD zu überlagern.

Damit wäre dann der Prolog erledigt. Um das nochmal kurz und bündig zu sagen: Der Prolog besteht aus der XML-Versionsangabe und einem Verweis auf die DTD oder der DTD selbst. Beide Elemente sind optional.

zurück                weiter

nach oben