XML Standards

Korrektes XML
Kommentare

Wenn Sie eigene XML-Dokumente anlegen oder mit bestehenden arbeiten, gibt es zwei Dinge, auf die Sie besonders achten müssen:
Ob das XML-Dokument wohlgeformt ist, sprich korrekt allen XML-Regeln für Tags und Attribute folgt.
Ob das XML-Dokument valide ist, sprich korrekt strukturiert ist und nur die in der Struktur erlaubten Tags und Attribute verwendet.
Wenn XML dargestellt oder anderweitig verarbeitet wird, wird es geparst. Der dafür zuständige Parser prüft auf jeden Fall die Wohlgeformtheit. Ist diese nicht gegeben, wird ein Fehler geliefert und die Verarbeitung scheitert. Ob der Parser auch die Gültigkeit (Validität) prüft, hängt vom Parser ab. Tut er es, spricht man auch von einem validierenden Parser.

Wohlgeformt

Wohlgeformt bedeutet, dass das XML-Dokument den Regeln für ein korrekt erstelltes XML folgen muss. Diese Regeln sind:

  • Das Dokument muss mindestens ein Element enthalten, das Wurzelelement. Dieses Element muss auf der obersten Ebene alleine stehen.
  • Jedes Tag muss geschlossen werden. Das gilt auch für Tags, die keinen Inhalt haben, und kann direkt im Tag erfolgen:

<telefon nummer=“00000″/>

Profitipp In XHTML wird in der Praxis zwecks Abwärtskompatibilität vor dem schließenden Schrägstrich ein Leerzeichen gelassen. In XML ist das nicht notwendig.
  • Tags dürfen nicht ineinander verschachtelt werden. Falsch wäre also:

<email><business>th@hauser-wenz.de
</email></business>

Richtig wäre dagegen:

<email><business>th@hauser-wenz.de
</business></email>

  • XML unterscheidet zwischen Groß- und Kleinschreibung. Folgendes führt also zu einem Fehler, weil der Parser kein schließendes Tag findet:

<Email>th@hauser-wenz.de</email>

  • Die Unterscheidung zwischen Groß- und Kleinschreibung gilt auch für Attribute.
  • Attributwerte müssen immer in Anführungszeichen stehen. Folgende Variante geht also nicht:

<telefon nummer=00000 />

  • Ein Attributname darf nur einmal in einem Tag vorkommen.
  • Sonderzeichen wie spitze Klammern dürfen nicht in den Inhalten von Tags stehen, da sie mit Markup, sprich Tags, gefüllt sind. Um solche Daten einzusetzen, müssen Sie CDATA-Sektionen verwenden. CDATA steht für Character Data – sie enthalten beliebige Zeichen und werden vom XML-Parser unverändert gelassen:
<![CDATA[
Inhalte mit <hervor>spitzen</hervor> Klammern
]]>

Die CDATA-Sektion wird im Internet Explorer eigens ausgewiesen und unverändert gelassen

  • Werden Sonderzeichen (Entitäten) wie spitze Klammern nicht in einer CDATA-Sektion eingesetzt, müssen sie mit den aus HTML bekannten Sonderzeichen &lt; (<) und &gt; (>) kodiert werden.
  • Ein Attributwert darf keine XML-Sonderzeichen, sprich spitze Klammern, enthalten. Sie müssen sie wie bei Inhalten kodieren. Einfache und doppelte Anführungszeichen verwenden Sie mit &apos; (‚) und &quot; („).

Die hier genannten und noch einige andere wesentlich seltener vorkommende Probleme bei wohlgeformten Dokumenten lassen sich auch im Browser betrachten. Internet Explorer und Mozilla Firefox liefern jeweils bei nicht wohlgeformten Dokumenten eine entsprechende Fehlermeldung. Die Fehlermeldung des Firefox ist zwar hässlicher, gibt aber genauere Angaben zur Stelle, an der der Fehler aufgetreten ist.

Fehler in der Wohlgeformtheit finden alle XML-Parser (oben Firefox, unten Internet Explorer)

Sonderzeichen und Zeichensatz

XML-Tags können jede Art von Zeichen oder Sonderzeichen enthalten, die im Zeichensatz des XML-Dokuments angegeben sind. Denkbar wäre also:

<tele.fon nummer=“000000″ />

oder:

<e-mail>th@hauser-wenz.de</e-mail>

Aber auch deutsche Umlaute sind möglich:

<länder></länder>

In der Praxis sollten Sie auf solche Tag-Namen verzichten. Sie sind problematisch, wenn Sie den Zeichensatz wechseln möchten. Noch schwieriger wird es aber, wenn Sie per Programmierung auf das XML-Dokument zugreifen möchten.

Aufmacherbild: Magnifying glass showing xml word on grey background von Shutterstock / Urheberrecht: wavebreakmedia

[ header = Strukturierung ]

Strukturierung

Ein XML-Dokument ist in vielen Praxisfällen schon einsetzbar, wenn es wohlgeformt ist. Wieso also eine korrekte Struktur? Mit den Struktursprachen legen Sie fest, welches Tag mit welchem Tag verschachtelt wird und welche Attribute ein Tag enthält. Das heißt also, die Struktursprache legt die komplette Struktur des Dokuments fest. Wird diese nicht eingehalten, ist das Dokument nicht valide (gültig).

Strukturierung ist immer dann notwendig, wenn Sie das Dokument nicht mit einem einzigen Entwickler und in einer einzigen Anwendung verwenden möchten. Nehmen Sie beispielsweise an, Sie wollen eine Dokumentation in XML schreiben: Nur, wenn Sie am Anfang festlegen, welche Tags erlaubt sind und in welcher Ordnung diese zueinander stehen, werden Sie nachher von den fünf Dokumentationsschreibern nicht völlig Unterschiedliches erhalten.

Aber auch, wenn Sie XML-Daten mit XSLT beispielsweise in HTML transformieren möchten oder mit XSL-FO aus XML ein PDF machen, sollten Sie eine festgelegte Struktur verwenden und vorab prüfen. So können Sie sich sicher sein, dass ein falsch gesetztes Tag nicht Ihre ganze Transformation scheitern lässt.

Für XML gibt es mehrere Struktursprachen. Am ältesten ist die DTD (Document Type Definition). Sie stammt aus SGML-Zeiten. Da sie allerdings selbst keine eigene auf XML basierende Sprache ist, wurde vom W3C als Alternative XML Schema geschaffen. Diese Strukturierungssprache bietet eine komplett XML-basierte Strukturierungssprache und neue Datentypen beispielsweise für Zahlen. Da die DTD etwas kryptisch in der Syntax ist und XML Schema zu sehr komplexen Dokumenten führt, sind über die Jahre noch andere Schemasprachen entstanden. Die bekannteste davon ist RelaxNG. Sie besitzt eine einfache und eine komplexe Syntax und bietet sich an, wenn Sie schnell viele und komplexe Strukturdokumente erstellen müssen.

DTD

Die Document Type Definition hat beim W3C kein eigenes Standardisierungsdokument, sondern steckt mit im XML-Standard (http://www.w3.org/TR/REC-xml/).

Hinweis Wenn Sie sich eine komplexere DTD ansehen möchten, sind die HTML- und XHTML-DTDs eine gute Wahl. Rufen Sie beispielsweise einfach http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd auf und Sie erhalten die XHTML-Transitional DTD. Um sie anzuzeigen, müssen Sie sie direkt oder nach dem Speichern in einem Texteditor öffnen.

Es gibt drei Arten, eine DTD einzubinden:

  • Intern direkt in der XML-Datei. Die DTD wird dabei mit <!DOCTYPE eingeleitet. Dann folgen das Wurzelelement und anschließend in eckigen Klammern die Anweisungen:
<!DOCTYPE kontakte [
  DTD-Anweisungen
]>
  • Extern im Kopf der XML-Datei. Hierzu wird auch das Wurzelelement geschrieben, dann folgt das Schlüsselwort SYSTEM für einen Verweis in das System, anschließend in Anführungszeichen die Adresse der externen DTD:
<!DOCTYPE kontakte SYSTEM "kontakte.dtd">
  • Externe DTDs haben meist die Dateiendung .dtd, dies ist allerdings keine Pflicht. Eine externe DTD besteht nur aus den DTD-Anweisungen und optional noch einer XML-Deklaration am Anfang.
  • Extern mit öffentlichem Identifikator. Fügt einen Verweis auf eine externe DTD ein, die noch einen Identifikator hat: 
<!DOCTYPE kontakt PUBLIC "Identifikator" "DTD-URL"> 
  • Solche DTD-Verweise werden für DTDs von Standards, beispielsweise für die von XHTML verwendet:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"%gt;
  • Zweck dieser Form des Links ist, dass der Validierer die DTD nicht jedes Mal neu laden muss, sondern sie integrieren und zwischenspeichern kann.

Die zwei externen DTD-Verweise lassen sich auch mit internen DTD-Anweisungen vermischen. Beispielsweise ist es denkbar, in der externen DTD die Grundstruktur anzugeben und in der internen noch ein Element zu definieren:

<!DOCTYPE kontakte SYSTEM "kontakte.dtd" [
  DTD-Anweisungen
]>

Hier ein Beispiel, bei dem ein weiteres Attribut für ein XML-Dokument mit den Kontakten definiert wird:

<!DOCTYPE kontakte SYSTEM "kontakte.dtd" [
  <!ATTLIST telefon
    landesvorwahl CDATA #IMPLIED
  >
]>

Die Vermischung interner und externer DTD-Regeln ist nicht die einzige Chance, DTD-Anweisungen aus mehreren Quellen einem XML-Dokument zuzuweisen. Sie können auch Entitäten verwenden, um die DTDs zu laden und einzusetzen:

<!DOCTYPE kontakte [
  <!ENTITY % kontakte SYSTEM "kontakte.dtd">
  %kontakte;
  <!ENTITY % kontakte2 SYSTEM "kontakte2.dtd">
  %kontakte2;
]>

Diese Technik lädt beide DTDs und setzt sie zusammen. Schwierigkeiten gibt es, wenn in einer DTD die gleichen Elemente definiert sind wie in der zweiten.

Profitipp Mit mehreren DTDs sollten Sie ausgesprochen vorsichtig umgehen. In der Praxis lässt es sich gerade bei komplexeren Dokumenten nämlich kaum vermeiden, dass es zu Element­namens­dopp­lungen kommt. Unter Umständen sind hier XML Schemas mit Namensräumen besser geeignet.
Eine erste DTD

Eine DTD dient dazu, die Struktur des Dokuments zu beschreiben. Entsprechend müssen darin Elemente und ihre Beziehung zueinander abgebildet werden. Ein Element steht immer in einem <!ELEMENT >-Befehl. Das Element wiederum enthält die Namen der darin enthaltenen Elemente. Die folgende Zeile bedeutet beispielsweise, dass das Tag <kontakte> das Tag <kontakt> ein oder mehrmals enthält:

<!ELEMENT kontakte (kontakt+)>

Enthält ein Element keine Unterelemente, so umfasst es Daten, die per Datentyp angegeben werden:

  <!ELEMENT vorname (#PCDATA)>
Hinweis In der DTD bzw. den DTDs müssen alle Elemente für ein XML-Dokument definiert sein. Es dürfen keine Elemente vorkommen, die nicht in der DTD stehen. Ansonsten ist das Dokument nicht valide.

Für jedes Element wiederum kann es Attribute geben. Diese wiederum sind in dem Befehl <!ATTLIST > zu finden. Er enthält den Tag-Namen und danach die Attributnamen, gefolgt vom Datentyp und einer Angabe, ob das Element notwendig ist:

  <!ATTLIST kontakt
    id ID #REQUIRED
    art CDATA #IMPLIED
  >

Im Folgenden sehen Sie die schon aus Kapitel 1 bekannte XML-Datei mit DTD:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE kontakte [
  <!ELEMENT kontakte (kontakt+)>
  <!ELEMENT kontakt (vorname, nachname, telefon)>
  <!ATTLIST kontakt
    id ID #REQUIRED
    art CDATA #IMPLIED
  >
  <!ELEMENT vorname (#PCDATA)>
  <!ELEMENT nachname (#PCDATA)>
  <!ELEMENT telefon EMPTY>
  <!ATTLIST telefon
  nummer CDATA #REQUIRED
>
]>
<kontakte>
  <kontakt id="k1" art="privat">
    <vorname>Tobias</vorname>
    <nachname>Hauser</nachname>
    <telefon nummer="00000"/>
  </kontakt>
  <kontakt id="k2" art="geschäftlich">
    <vorname>Christian</vorname>
    <nachname>Wenz</nachname>
    <telefon nummer="11111"/>

In den nächsten Abschnitten erfahren Sie, wie Sie ein XML-Dokument gegen DTDs prüfen. Außerdem lesen Sie mehr über Elemente und Attribute in DTDs, damit Sie eigene erstellen können.

Profitipp Programme wie XMLSpy oder Stylus Studio und ebenso viele Hilfstools erstellen DTDs und Schemata auch automatisiert aus XML-Dokumenten. Es kann deswegen praktisch sein, die Struktur in XML zu schreiben, sich dann daraus das Strukturdokument generieren zu lassen und dies anzupassen.
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -