Namespaces in XML

Zusammenfassung:
Diese Lerneinheit beinhaltet eine Einführung in XML Namespaces. XML Namespaces weisen jeder XML Anwendung eine URI zu und weisen jeder Elementdeklaration dieser Markupsprache einen einmaligen Präfix zu. Hier wird es erläutert, wie ein Namespace zu definieren ist.
Auch wenn es mit Hilfe von XML möglich ist, sich eigene Markupsprachen zu definieren, ist es doch sinnvoll, das Rad nicht jedes Mal neu zu erfinden. Warum sollte man zum x-ten Mal ein Paragraph Element definieren, wenn sich schon jemand anderes die Mühe gemacht hat? Um Inhaltsmodelle verschiedener in XML definierten Markupsprachen miteinander kombinieren zu können, gibt es die Möglichkeit, Teile einer DTD oder einer XML Schema Beschreibung zu importieren. Um bei unserem Wörterbuchbeispiel einige einleitende Worte zu schreiben, reichen die Elemente von HTML aus. Beim Zusammenfügen von verschiedenen Markupsprachen kann es allerdings schnell vorkommen, dass Elementnamen mehrfach auftreten. Zwei Beispiele:
Beispiel 92: Ambige XML-Instanz 1
<Bank>
<Name>Deutsche Bank</Name>
<Umsatz-Steuer-Id>123445</Umsatz-Steuer-Id>
</Bank>
Beispiel 93: Ambige XML-Instanz 2
<Bank>
<Anzahl_der_Sitzplaetze>2</Anzahl_der_Sitzplaetze>
<Breite>2m</Breite>
</Bank>
Das ist nicht nur bei einer DTD nicht erlaubt, da der Parser nicht weiß, welche Elementdeklaration die korrekte ist, es ist auch höchst ambig für einen menschlichen Leser: bezeichnet ein Element Bank ein Geldinstitut oder eine Bank als Möbelstück? Um beiden Problemen zu begegnen, gibt es XML Namespaces. Mit XML Namespaces kann jeder XML Anwendung (also jeder in XML definierten Markupsprache) eine URI und jeder Elementdeklaration dieser Markupsprache ein einmaliges Präfix zugewiesen werden. Dieses Präfix steht stellvertretend für den Namespace (Namensraum), der durch die URI repräsentiert wird. Umgesetzt auf das obige Beispiel wäre also folgende Änderung möglich:
Beispiel 94: Nicht ambige XML-Instanz 1
<gi:Bank>
<gi:Name>Deutsche Bank</gi:Name>
<gi:Umsatz-Steuer-Id>123445</gi:Umsatz-Steuer-Id>
</gi:Bank>
Beispiel 95: Nicht ambige XML-Instanz 2
<m:Bank>
<m:Anzahl_der_Sitzplaetze>2</m:Anzahl_der_Sitzplaetze>
<m:Breite>2m</m:Breite>
</m:Bank>
Damit haben wir zwei verschiedene Typen des Elements Bank erzeugt.
Die URI für den Namespace von XHTML zum Beispiel ist folgende: http://www.w3.org/1999/xhtml. Die Angabe der URI muss nicht auf eine real vorhandene Datei verweisen, sie dient nur formalen Zwecken (unter der hier angegebene Adresse findet man beim W3C eine XHTML Seite, die über den Namespace und den aktuellen Standard informiert).

Definition eines Namespaces

Namespaces werden mit Hilfe des Attributes xmlns ("XML Namespace") definiert. Dieses Attribut kann an beliebige XML Elemente angehängt werden (allerdings muss das Attribut dazu in der DTD deklariert sein [» Namespaces in der DTD]). Es setzt sich wie folgt zusammen:
xmlns:PRÄFIX="URI"
Wobei PRÄFIX für ein selbst gewähltes Präfix steht, das stellvertretend für einen Namespace steht – in den obigen Beispielen gi für Geldinstitut und m für Möbelstück. Das Präfix muss ein gültiger XML Name sein (vgl. » Namen in XML), mit folgenden Einschränkungen: der Doppelpunkt ":" und die Buchstabenkette "xml" und "xmlns" dürfen nicht enthalten sein [W3C (Hrsg.), 1999]. Eine gültige Namespace-Definition für unser Wörterbuch könnte also wie folgt aussehen:
Beispiel 96: ASCL-Namespace
xmlns:ascl="http://www.uni-giessen.de/fb09/ascl"
Das Präfix steht vor dem Element, das aus dem Namensraum des Präfix steht, also sähe eine vollständige Namespace-Definition für das Wörterbuch so aus:
Beispiel 97: Element mit ASCL-Namespace
<ascl:woerterbuch xmlns:ascl="http://www.uni-giessen.de/fb09/ascl">
Damit würde dem Element woerterbuch – und seinen Kindelementen – der Namespace http://www.uni-giessen.de/fb09/ascl zugewiesen – stellvertretend durch das Präfix ascl.
Um sich die Funktionalität des Präfixes zu verdeutlichen, bietet es sich an – wie Clark es in [Clark, James, 1999] macht, die stellvertretende URI vor das Element zu setzen:
Beispiel 98: ASCL-Namespace mit URI
<{http://www.uni-giessen.de/fb09/ascl}woerterbuch>
Diese Konstruktion wird als Universal Name bezeichnet, kann aber von XML-Parsern nicht interpretiert werden und dient an dieser Stelle nur zur Verdeutlichung.
Genau wie Elementen kann auch Attributen ein Namespace Präfix vorangestellt werden, was sich allerdings nur anbietet, wenn Attribute aus verschiedenen Namespaces verwenden will, die aber alle einem Element zugeordnet sind, dass in beiden (allen) Namespaces den gleichen Namen trägt.
Die Definition von Namespaces kann an zwei Stellen im Dokument erfolgen: im Wurzelelement oder direkt an den entsprechenden Elementen. Genau so ist es auch erlaubt, zwei Präfixe einem Namespace zuzuordnen (Harold, Eliotte Rusty, 2001, S. 344)
Ein Element mit einem vorangestellten Präfix besitzt einen Qualified Name . Ein Qualified Name setzt sich zusammen aus dem Präfix, gefolgt von einem Doppelpunkt und dem lokalen Namen (local name). Im obigen Beispiel ist der local name also woerterbuch – die Elementbezeichnung [W3C (Hrsg.), 1999].

Standard (default) Namespace

Wenn große Teile eines Dokuments aus Elementen und Attributen des gleichen Namespace sind, ist es sehr mühselig (und auch fehleranfällig), alle mit dem entsprechenden Präfix zu versehen. Daher gibt es die Möglichkeit, einen default Namespace zu vergeben, also einen Namespace, der für alle Elemente und Attribute ohne Präfix gelten soll. Ein solcher default Namespace wird definiert durch die Verwendung des Attributs xmlns ohne darauf folgendes Präfix:
xmlns="http://www.w3.org/1999/xhtml
Im obigen Fall wäre der default Namespace also der von XHTML. Dies ist sehr oft der Fall, da (X)HTML ein oft genutztes Ausgabeformat für in XML gespeicherte Informationen ist. Durch den Wegfall des Präfixes sind auch ältere Browser in der Lage, die Seite korrekt darzustellen, daher wird oft folgende Angabe gemacht:
<html xmlns="http://www.w3.org/1999/xhtml">
Attribute können keinen default Namespace annehmen, daher müssen sie immer mit vorangestelltem Präfix genutzt werden.

Namespaces in der DTD

Wie schon angesprochen, befreien Namespaces nicht von den allgemeinen Regeln, denen gültige XML Dokumenten unterworfen sind. Das bedeutet, dass alle Elemente und Attribute, die in einem XML Dokument genutzt werden, – egal aus welchem Namespace – in der DTD (oder der XML Schema Beschreibung, vgl. » XML Schema Sprachen) deklariert werden müssen. Es ist aber möglich, wohlgeformte XML Dokumente mit verschiedenen Namespaces zu benutzen.
Das Problem, das Namespaces in der DTD aufwerfen, ist, dass alle Elemente und Attribute mit dem entsprechenden Namespace und dem Präfix deklariert werden müssen. Damit sind Dokumente mit Namespace und Dokumente, in denen das Namespace Präfix fehlt, nicht mehr nach ein und der selben DTD gültig – auch wenn der einzige Unterschied im fehlenden Präfix besteht. Ein gangbarer Weg ist es, das Attribut xmlns mit einem festen Vorgabewert, der dem URI entspricht, zu definieren.
Dennoch bleiben XML Namespaces in Verbindung mit DTDs nicht ganz frei von Problemen, die erst in » XML Schema Sprachen entfallen, da XML Schema Namespaces besser unterstützt (Namespace Awareness)
Zusammenfassung:

Übungsaufgaben

  1. Sind Namespaces innerhalb von Elementen "vererbbar"?
  2. Müssen Elemente anderer Namespaces in der DTD deklariert werden? Wenn ja warum?