Der Unterschied zwischen valid und well-formed

Tags:

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:

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.

Ähnliche Artikel

Kommentare