Der Unterschied zwischen valid und well-formed
Ein Beispiel erleichtert wie immer den Einstieg.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <root ></root>
Entgegen weitverbreiteter Annahme ist dieses XML Snippet nicht valid, sondern "nur" well-formed (wohlgeformt). Dies bedeutet, dass zwar die Regeln der XML Syntax eingehalten wurden und ein Parser problemlos mit dem Code umgehen könnte, aber die verwendete Struktur und deren Elemente nicht einer bestimmten Grammatik unterliegen. Man kann dies durchaus mit der Grammatik der deutschen Sprache vergleichen. In dieser ist zum Beispiel definiert, dass Nomen gross geschrieben werden. Ergo ist die Grammatik falsch, sobald ein Nomen klein geschrieben wird.
Da XML eine Form der Darstellung ist (als Vergleich können die lateinischen Zeichen herhalten), enhält sie per se keine grammatikalischen Regeln. Genauso wie ich mit den lateinischen Zeichen sowohl deutsche, also auch englische Texte schreiben kann. Will ich einen Satz auf deutsche Grammatik überprüfen, muss da irgendwie ein Bezug bestehen. Bei der Sprache ist dieser durch Metadaten (z.B. sagt mir jemand der folgende Text ist Deutsch) oder durch Erraten (wenn ich einen Text lese, erkenne ich grundsätzlich in welcher Sprache er geschrieben ist, solange ich die Sprache "kenne") gegeben.
Bei XML muss dieser Bezug aber explizit hergestellt werden. Und dazu gibt es zwei Möglichkeiten:
- per Document Type Definition (DTD)
- per XML Schemas
Da letztere Möglichkeit für unser Beispiel nicht von Relevanz ist, möchte ich auch nicht näher darauf eingehen.
Document Type Definition
Eine Dokumenttypdefinition (englisch Document Type Definition, DTD, auch Schema-Definition oder DOCTYPE) ist ein Satz an Regeln, der benutzt wird, um Dokumente eines bestimmten Typs zu deklarieren. [...] Die Dokumenttypdefinition besteht dabei aus Elementtypen, Attributen von Elementen, Entitäten und Notationen. Konkret heißt das, dass in einer DTD die Reihenfolge, die Verschachtelung der Elemente und die Art des Inhalts von Attributen festgelegt wird - kurz gesagt: die Struktur des Dokuments.
Soviel zur Wikipedia-Definition. Auch hier sagt ein Beispiel wieder mehr als lange, kryptische Sätze. Vergleichen wir die DTD für XHTML 1.0 Strict und XHTML 1.0 Transitional bezüglich der erlaubten Attribute des a-Elements (Anchor).
<!ATTLIST A id ID #IMPLIED class CDATA #IMPLIED style %StyleSheet; #IMPLIED title %Text; #IMPLIED lang %LanguageCode; #IMPLIED xml:lang %LanguageCode; #IMPLIED dir (ltr|rtl) #IMPLIED onclick %Script; #IMPLIED ondblclick %Script; #IMPLIED onmousedown %Script; #IMPLIED onmouseup %Script; #IMPLIED onmouseover %Script; #IMPLIED onmousemove %Script; #IMPLIED onmouseout %Script; #IMPLIED onkeypress %Script; #IMPLIED onkeydown %Script; #IMPLIED onkeyup %Script; #IMPLIED accesskey %Character; #IMPLIED tabindex %Number; #IMPLIED onfocus %Script; #IMPLIED onblur %Script; #IMPLIED charset %Charset; #IMPLIED type %ContentType; #IMPLIED name NMTOKEN #IMPLIED href %URI; #IMPLIED hreflang %LanguageCode; #IMPLIED rel %LinkTypes; #IMPLIED rev %LinkTypes; #IMPLIED shape %Shape; "rect" coords %Coords; #IMPLIED >
Dies ist der Auszug aus der DTD von XHTML 1.0 Strict. Die Definition für XHTML 1.0 Transitional unterscheidet sich nur in einer zusätzlichen Zeile:
target %FrameTarget; #IMPLIED
Diese erlaubt, wie man sich denken kann, die Verwendung des target-Attributes in XHTML 1.0 Transitional.
<!-- Nicht valid in XHTML 1.0 Strict --> <!-- Valid in XHTML 1.0 Transitional --> <a href="http://example.org" target="_blank">Test</a>
Zur Erinnerung: Der Code ist auch well-formed, allerdings hat dies nichts mit der DTD zu tun, sondern mit der XML Syntax.
Fazit
Da der Unterschied zwischen well-formed und valid jetzt klar ist, muss man sich nur selbst etwas an der Nase nehmen und im Kontext stehts den richtigen Ausdruck verwenden. Aus Erfahrung passiert der Fehler meist in Gesprächen und aus der Tatsache, dass für eigene XML Strukturen keine DTD geschrieben werden.




