XML – eine Metasprache

Die Extensible Markup Language (XML) erfreut sich höchster Beliebtheit. Jedoch handelt es sich bei XML nicht direkt um eine Sprache wie die Bezeichnung Language suggeriert. XML muss man eine Ebene höher ansiedeln. Es stellt eine Meta-Sprache dar – eine Sprache zur Beschreibung von Sprachen. Der XML Standard bietet ein Format, in welchem Sprachen definiert werden können. Jeder kann individuell XML-basierte Sprachen für seine Anwendungen und Formate definieren und nutzen.

XML-basierte Sprachen werden als Auszeichnungssprachen (Markup Language, kurz: ML) bezeichnet. Auszeichnungssprachen fügen Daten Metadaten hinzu. Diese geben beispielsweise Informationen zum logischen Aufbau einer Datenstruktur, können reine Daten semantisch näher beschreiben oder definieren die Ausgabe von Daten auf einem Gerät (Monitor, Drucker etc.).
Die Ausprägungen einer XML-basierten Sprache sind XML Dokumente die rein textbasiert sind und auf binäre Daten verzichten. Dadurch wird die einfache Lesbarkeit der Dokumente für den Menschen ermöglicht, was ein wichtiger Vorteil von XML ist.
Ein Programm zur Verarbeitung von XML Dokumenten wird als XML Parser bezeichnet.

Der XML-Standard wird vom w3c Konsortium definiert und gepflegt. Ursprünglich ist XML aus der Sprache SGML gewachsen. SGML ist ein wesentlich mächtigerer Standard zur Beschreibung von Auszeichnungssprachen, der jedoch aufgrund seiner schwergewichtigen Komplexität keine breite Akzeptanz gefunden hat.

XML Syntax

Wie sieht nun eine XML-basierte Sprache aus? Ein kurzes Beispiel hilft beim Verständnis. Wir möchten ein klassisches Abendbrot in einer XML-basierten Sprache beschreiben. Die Sprache könnte BrotzeitXML heißen. Ein BrotzeitXML-Dokument könnte folgendermaßen aussehen:

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

<Brotzeit>
    <Brot Art="Graubrot" geschnitten="Ja">
        <Menge Einheit="Gramm">250</Menge>
    </Brot>
    <Wurst Art="Lyoner">
        <Menge Einheit="Gramm">150</Menge>
    </Wurst>
    <Käse Art="Leerdammer">
        <Menge Einheit="Gramm">100</Menge>
    </Käse>
    <Bier Sorte="Pils">
        <Menge Einheit="Liter">0.4</Menge>
    </Bier>
</Brotzeit>

<!--Es ist angerichtet-->

Die erste Zeile des BrotzeitXML Dokumentes ist eine Verarbeitungsanweisung (Die Syntax <?xml Anweisung ?> errinnert an PHP). Diese Zeile ist obligatorisch für ein XML Dokument: XML Version und Kodierung des Zeichensatzes werden hier festgelegt.

Nun das Interessante: Basis der XML Syntax ist das Element. Es wird als Tag in der Form <Elementname></Elementname> notiert. Elemente können hierarchisch verschachtelt werden, was eine Baumstruktur zum Ergebnis hat. So ist es möglich, Kapselungen und Zugehörigkeiten auszudrücken. Leere Elemente sind zulässig und können in der Kurzform <Elementname /> notiert werden. Ein Beispielelement der BrotzeitXML ist <Brot></Brot>, <Wurst></Wurst> etc. Das Element <Brotzeit></Brotzeit> wird hier als sog. root-element bezeichnet, da es die Wurzel des XML-Baumes darstellt und alle anderen Elemente einschließt. Die Existenz eines root-elements ist zwingend notwendig in einer wohlgeformten XML Sprache (s. Bedingungen für Wohlgeformtheit).

Ein weiterer Informationsträger im XML Syntax sind Attribute, die als Schlüssel-Wertpaare in der Form Attribut=“Wert“ innerhalb eines Elementes definiert werden können. Beispiel: Sorte=“Pils“

Abschließend zeigt die letzte Zeile einen XML Kommentar in seiner syntaktischen Form: <!– Kommentar –>. Diese Syntax ist bereits von Kommentaren in (X)HTML Code bekannt. (XHTML ist die XML konforme Fassung von HTML zur Beschreibung der Struktur und des Inhalts von Webseiten. HTML war ursprünglich in SGML definiert worden.)

Da XML sehr flexibel zur Beschreibung von Datenstrukturen genutzt werden kann, werden XML Dokumente (aufgrund der Assoziation des Wortes Dokument zu reinen Textdokumenten) oftmals abstrakter als XML Instanzen bezeichnet.

Element vs. Attribut

Die Verfügbarkeit von sowohl Elementen als auch Attributen zur Modellierung von Auszeichnungssprachen birgt folgendes Problem: Meist kann ein Attribut auch durch ein Element ausgedrückt werden und umgekehrt. Dies ist letztlich eine Designentscheidung beim Entwurf einer XML Sprache, es gilt jedoch verschiedene Punkte zu berücksichtigen. Betrachten wir als Beispiel nur das Brot der Brotzeit:

<Brot Art="Graubrot" geschnitten="Ja">
    <Menge Einheit="Gramm">250</Menge>
</Brot>

Die Menge ist als eigenes Element angegeben. Die Einheit der Menge wiederum als Attribut der Menge. Nun ist es auch möglich die Menge direkt als Attribut im Element Brot unterzubringen:

(1) <Brot Art="Graubrot" geschnitten="Ja" Menge="250g"></Brot> ODER
(2) <Brot Art="Graubrot" geschnitten="Ja" Menge="250" Einheit="Gramm"></Brot>

Generell sollte man bei solchen Entwurfsentscheidungen an die Lesbarkeit und die weitere Verarbeitung der XML Dokumente denken. Das Attribut Menge kann viele verschiedene Einheiten haben: gramm, pfund, liter etc. Bringt man diese Einheit als Kürzel an das Ende der Mengenangabe wie in Variante (1) muss der XML Parser bei der Verarbeitung stets die Einheit aus dem String extrahieren.
Variante (2)  trennt die Menge und deren Einheit in zwei einzelne Attribute auf. In diesem Konstrukt beschreibt das Attribut Einheit nun das Attribut Menge näher. Eine solches Design ist generell zu vermeiden. Attribute sollten atomar sein und sich lediglich auf ihr Element beziehen.

Beim Entwurf einer XML-basierten Sprache ist immer abzuwägen, welche Entitäten durch Elemente und welche durch Attribute zu beschreiben sind. Ein extrem tief verzweigter XML Baum der viele Elemente hierarchisch verschachtelt ist immer aufwändig zu traversieren. Eine hohe Anzahl an Attributen lässt die Lesbarkeit ebenso leiden wie eine Vielzahl von Elementtags. Ein strukturierter Ansatz zum Weiterdenken findet sich hier.

Ein Format – viele Sprachen

Das XML-Format ist vielseitig einsetzbar. Während das obige Beispiel der BrotzeitXML eine Datenstruktur (nämlich ein Abendbrot) beschreibt, war XML (bzw. vorher SGML) zu Beginn vor allem für die Auszeichnung von Dokumenten (Textdokumente) gedacht. Man stelle sich folgende XML Sprache vor:

<Artikel>
<Titel>XML - ein vielseitiges Format</Titel>
<Autor>Michael Keutel</Autor>
<Inhalt>
    <Absatz>
        XML ist universell einsetzbar. Warum? Aus folgendem Grund ...
    <Absatz>
</Inhalt>
<Quellen>
    http://de.wikipedia.org/wiki/Extensible_Markup_Language
    http://www.michaelkeutel.de/blog/xml
</Quellen>
</Artikel>

Dieses Dokument beschreibt den logischen Aufbau eines geschriebenen Artikels. Hier werden Textteile semantisch ausgezeichnet. Ließe man alle XML Tags weg, würde man das Dokument dennoch als Artikel erkennen, Titel, Autor und Quellen zuordnen können. Die XML Auszeichnung bringt nun aber einen immensen Vorteil wenn es um die automatische Verarbeitung von Dokumenten geht. Ein XML Parser, der dieses Dokument einliest, kann sofort den Titel und den Autor des Artikels extrahieren. Die XML-Tags grenzen die Entitäten des Dokumentes gegeneinander ab. Natürlich kann der Inhalt des Artikels wesentlich länger sein und sich über viele Absätze erstrecken.

In diesem Zusammenhang finde ich es wichtig die Trennung von Inhalt, Struktur und Präsentation anzusprechen. XML Elemente können ihren Inhalt auf verschiedene Weisen auszeichnen.

(1) <Autor>  Michael Keutel </Autor>
(2) <Text>   Michael Keutel </Text>
(3) <Kursiv> Michael Keutel </Kursiv>

Variante (1) nimmt eine inhaltliche Auszeichnung vor. Michael Keutel ist Autor. Variante (2) nimmt eine strukturelle Auszeichnung der Daten Michael Keutel vor. Es handelt sich um Text (nicht um ein Bild oder ein Video, sondern um Text). Die letzte Variante nimmt eine Auszeichnung bezüglich der Präsentation der Daten vor. Der Text Michael Keutel soll kursiv geschrieben werden. Modelliert man eine eigene XML Sprache sollte man immer die Vermischung dieser 3 Komponenten möglichst vermeiden. Das obige Beispiel übt nur inhaltliche Auszeichnungen. Es wird keine Information gegeben wie ein Absatz zu präsentieren ist (z.Bps im Druck oder auf einer Webseite) oder wie Quellenangaben zu formatieren sind. Das ist gut so. Warum? Das Layout bzw. die Präsentation des Dokumentes ist unabhängig vom Inhalt des Dokumentes. Das bedeutet das Dokument kann auf verschiedene Weisen präsentiert werden. Diese Möglichkeit unterbindet man jedoch wenn Anweisungen zur Präsentation in den Auszeichnung des Dokumentes definiert werden.
Ein bekanntes Beispiel ist die Auszeichnungssprache HTML. HTML-Tags wie <b> und <i> für fette und kursive Darstellung üben eine Auszeichnung, die das Layout betrifft. Ebenso tauchten Attribute wie width, height und align ursprünglich innerhalb vieler HTML-Elemente auf. Erst mit der Entwicklung von CSS und der weiteren Standardisierung von HTML wurde die Trennung von Inhalt und Layout angekurbelt. Die Präsentation von HTML Daten soll auschließlich in Cascading Style Sheets definiert werden. Nur so wird eine flexible Darstellung einer Webseite ermöglicht. Zudem sind HTML Dokumente wesentlich lesbarer wenn auf Layout-Auszeichnungen verzichtet wird.

DTD, XML Schema – Definiere deine Sprache

Entwerfe ich meine eigene XML-basierte Auszeichnungssprache muss ich irgendwo eine Definition dafür festhalten. Ganz klar. Nur so erhalte ich die Möglichkeit XML Dokumente in meinem Format auf Validität zu prüfen.
Es gibt zwei Möglichkeiten: Dokumenttypdefinition (DTD) oder XML-Schema-Definition (XSD)
Die Dokumenttypdefinition ist in die Jahre gekommen. Sie nutzt einen eigenen Syntax, kann keine Datentypen unterscheiden und kennt keine Namensräume.
XSD ist moderner. Sie stellt selbst eine XML-Sprache dar. Die Definition der eigenen XML Sprache ist somit wiederum ein XML Dokument. Namensräume, die Unterscheidung verschiedener Datentypen und Modellierung komplexerer Zusammenhänge sind damit möglich. Eine Einführung zu Schema findet sich hier.

Was noch?

XML ist die Grundlage für eine Reihe weiterer wichtiger Technologien wie XPath, XSLT, XQuery und XSL-FO. Eine Alternative zu XML bietet JSON.

Autor:    Michael Keutel | 12.10.2012