Namensraum (XML)

XML-Namensräume (englisch „XML namespaces“) werden benutzt, um Elemente und Attribute in einem XML-Dokument eindeutig zu identifizieren und um in einem einzelnen Dokument mehrere XML-Sprachen mischen zu können. Ihre Funktionsweise ist mit Vorwahlen bei Telefonnummern zu vergleichen.

Zum Beispiel beschreibt das <p>-Element in XHTML einen Absatz; in einer XML-Sprache für eine Personendatenbank könnte <p> ein Element für eine Person darstellen. Namensräume erlauben, diese Elemente eindeutig zu unterscheiden.

Der Namensraum-Mechanismus für XML-Daten wurde vom W3-Konsortium entwickelt und liegt seit dem 8. Dezember 2009 in der dritten Auflage sowohl für XML 1.0 als auch für XML 1.1 vor. Die erste Version der Spezifikation datiert auf den 14. Januar 1999, also etwa ein Jahr nachdem die XML-Spezifikation verabschiedet wurde. Aus diesem Grund findet man z. B. in der Empfehlung zu MathML 1.0 noch keine Namensraumangabe. Die zweite Version wurde am 16. August 2006 veröffentlicht.

Struktur von XML-Namensräumen 
Namensräume werden durch URIs dargestellt, meistens also durch normale Webadressen. Dabei ist zu beachten, dass die entsprechende Adresse nicht existieren muss. Sie kann beliebig definiert werden. Wichtig ist zudem, dass bei Namensraumangaben auf Groß- und Kleinschreibung, auch im Host-Teil, sowie eine eventuelle URL-Kodierung, z. B. %C3%A4 statt ä, geachtet werden muss.

Wenn eine URL als Namensraum verwendet wird, ist es jedoch meistens sinnvoll, unter dieser Adresse zusätzliche Informationen zu der XML-Sprache anzubieten, z. B. eine Dokumenttypdefinition (DTD) oder ein XML-Schema.

Namensräume verwenden 
Für Namensräume wird das Attribut xmlns (für engl.: XML Namespace) verwendet:

<html xmlns="http://www.w3.org/1999/xhtml">
  ... restliche HTML-Datei
</html>

Das <html> Element sowie alle seine Kindelemente, also Elemente innerhalb von <html>...<code></html></code>, gehören hier zum Namensraum W3C XHTML namespace . Namensräume können auch verschachtelt werden:

<html xmlns="http://www.w3.org/1999/xhtml">
  ... XHTML-Elemente
  <math xmlns="http://www.w3.org/1998/Math/MathML">
    ... MathML-Elemente
  </math>
  ... XHTML-Elemente
</html>

Präfixe 
Zusätzlich zur oben beschriebenen Methode existiert ein Präfix-Mechanismus: Elemente können durch eine Zeichenkette, die durch einen Doppelpunkt vom Elementnamen getrennt wird, in einen beliebigen Namensraum gesetzt werden. Das Präfix muss keinerlei Beziehung zum Namensraum haben, jedoch zuerst an den Namensraum „gebunden“ werden:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:m="http://www.w3.org/1998/Math/MathML">
  ... XHTML-Elemente
  <m:math>
    ... MathML-Elemente mit m:-Präfix
  </m:math>
  ... XHTML-Elemente
</html>

In diesem Beispiel wird im <html>-Element mit der Angabe xmlns:m="..." das Präfix m an den MathML-Namensraum gebunden. Danach können Elemente durch die Angabe

<m:Elementname>...</m:Elementname>

in den entsprechenden Namensraum gesetzt werden.

Den eigentlichen Elementnamen, also den Teil ohne führendes Präfix und Doppelpunkt, nennt man den lokalen Namen des Elements. Der vollständige oder qualifizierte Name des Elementes (kurz QName) besteht aus Namespace-URI und lokalem Namen, das Präfix kann somit beliebig gewählt werden.

Das Präfix xmlns 
Technisch gesehen ist ein Konstrukt der Art xmlns:m ein Attribut mit einem Namensraumpräfix. Es existiert in dem Fall der Verwendung von Präfixen also ein zusätzlicher Namensraum

 xmlns:xmlns="http://www.w3.org/2000/xmlns/"

im Dokument. Dieser wird jedoch nicht explizit angegeben, sondern von XML-verarbeitenden Programmen vorausgesetzt. Wie das folgende xml ist auch dieses Präfix fest mit dem oben angegebenen Namensraum verknüpft.

Das Präfix xml 
XML-Elemente dürfen nicht mit der Zeichenkette xml anfangen. Daraus folgt, dass auch XML-Namensraum-Präfixe nicht mit xml anfangen dürfen. Tatsächlich ist an xml ein Namensraum für Elemente und Attribute gebunden, den das W3-Konsortium für Erweiterungen von XML reserviert.

Der URI dieses Namensraums ist http://www.w3.org/XML/1998/namespace . Er muss nicht explizit angegeben werden, sondern wird von den verarbeitenden Programmen selbst eingefügt.

Derzeit existieren folgende Attribute mit Präfix xml (Stand April 2010):

Attribute 
Attribute in XML sind sogenannte assoziierte Knoten. Sie werden nicht wie normale Kindelemente eines Elements behandelt. Bei Namensräumen heißt das, dass Attribute nicht im Namensraum des Elements stehen, in dem sie notiert sind, sondern vorgabemäßig im Null-Namensraum.

Es gibt Fälle, in denen man dies explizit ändern will. Beispielsweise werden Links in SVG von der Sprache XLink übernommen, die ein Set von Attributen bereitstellt, mit denen Links beschrieben werden können. In diesem Fall müssen die einzelnen Attribute mit einem Präfix versehen werden:

<svg xmlns="http://www.w3.org/2000/svg"
   xmlns:xlink="http://www.w3.org/1999/xlink">
  <a xlink:href="grafik2.svg">Link zu Grafik 2</a>
</svg>

Es gibt für Attribute keine Möglichkeit, sie ohne Präfix in einen bestimmten Namensraum zu setzen.

Beispiel 
Im folgenden Beispiel werden Elemente beziehungsweise Attribute aus den XML-Sprachen XHTML (blau), MathML (rot), SVG (grün) und ohne Namensraum (schwarz) gemischt. Insbesondere ist zu beachten, dass das Attribut xmlns selbst in keinem Namensraum liegt, sein Wert ist lediglich eingefärbt, um anzuzeigen, welche Elemente von ihm betroffen sind.

 <html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:svg="http://www.w3.org/2000/svg">
   <head>
     <title>Beispiel-Datei mit mehreren Namensräumen</title>
   </head>
   <body>
     <h1>Eine Mathe-Formel:</h1>
     <math xmlns="http://www.w3.org/1998/Math/MathML">
       <mi>x</mi><mo>=</mo><mn>2</mn>
     </math>
     <p>Und noch ein kleines Bild dazu:</p>
     <svg:svg>
       <svg:rect x="0" y="0" width="10" height="10" />
       <svg:text>
         <svg:tspan>Eine Formel in der Grafik:</svg:tspan>
         <svg:tspan>
           <math xmlns="http://www.w3.org/1998/Math/MathML">
             <mi>y</mi><mo>=</mo><mn>1</mn>
           </math>
         </svg:tspan>
       </svg:text>
     </svg:svg>
     <p>Eine SVG Grafik kann auch ohne Präfix verwendet werden:</p>
     <svg xmlns="http://www.w3.org/2000/svg">
       <circle svg:cx="10" svg:cy="10" svg:r="5" svg:fill="red" />
     </svg>
   </body>
 </html>

Namensraum-Notation nach James Clark 

Namensraum-Präfixe können frei gewählt werden. In manchen Kontexten, z. B. wenn man nur einen kleinen Ausschnitt eines komplexeren XML-Dokuments sieht, kann diese Beliebigkeit zu Missverständnissen führen. James Clark hat deshalb in seinem Artikel XML Namespaces eine andere Notation für Elementnamen eingeführt, die sich in der Dokumentation von XML-Daten steigender Beliebtheit erfreut.

Ein einfaches Beispiel könnte demnach so aussehen:
 <{http://www.w3.org/1999/xhtml}html>
   <{http://www.w3.org/2000/svg}svg>
   </{http://www.w3.org/2000/svg}svg>
 </{http://www.w3.org/1999/xhtml}html>

Elemente im Fließtext werden dann z. B. als {http://www.w3.org/1999/xhtml}html notiert.

Der URI eines Namensraums wird dabei bei jedem Element in geschweiften Klammern davor gesetzt. Dadurch wird das Element mit seinem Namensraum eindeutig charakterisiert. Dies ist der große Vorteil dieser auf den ersten Blick etwas umständlich erscheinenden Methode.

Zu beachten ist, dass diese Notation kein gültiges XML darstellt. Sie dient ausschließlich zur Veranschaulichung und Dokumentation von Namensräumen.

Schwierigkeiten mit XML-Namensräumen

Doppelpunkte in Elementnamen 
XML-verarbeitende Programme werden in zwei Gruppen eingeteilt:

 Programme, die Namensräume beachten und verarbeiten
 Programme, die Namensräume nicht beachten

Der wichtigste Unterschied ist der Umgang mit Doppelpunkten in Elementnamen. Wird das Dokument von einem Namensraum-sensiblen Programm verarbeitet, müssen alle Doppelpunkte als Trenner von Präfixen und Elementnamen interpretiert werden – anderenfalls erzeugt das Programm einen Fehler. Programme, die nicht nach Namensräumen unterscheiden, führen diese Überprüfung nicht durch.

In XML selbst ist es erlaubt, Elemente zu definieren, die den Doppelpunkt bereits im Elementnamen tragen. Dies wird jedoch ausdrücklich nicht empfohlen. Dateien, die Namensräume verwenden, sind dadurch jedoch wohlgeformte XML-Dokumente.

URLs als Namensräume 
Es ist eine regelmäßige Frage in entsprechenden Foren, was man denn nun unter der URL hinterlegen soll, die als Namensraum-Definition verwendet wird. Die einfache Antwort ist, dass dort nichts existieren muss. URLs, und allgemeiner URIs, werden als Definition verwendet, weil sie gewisse Hinweise liefern können, von wem die "Sprache" entwickelt wurde, und weil die entsprechenden Personen oder Organisationen eine gewisse zumindest symbolische Kontrolle über einen bestimmten URL-Bereich (z. B. http://www.w3.org/… für das W3-Konsortium) besitzen.

Dokumenttyp-Definitionen und Namensräume 
XML-Sprachen werden heute noch häufig mit sogenannten Dokumenttyp-Definitionen definiert. Diese DTDs, die noch aus der SGML-Zeit stammen, waren nie dazu bestimmt, Namensräume zu beachten (DTDs wurden in den 1980ern entwickelt). Es ist sehr umständlich und zum Teil unmöglich, z. B. bei beliebigen Präfixen oder in XSLT, eine allgemein gültige DTD für eine XML-Sprache oder ein Dokument aufzustellen.

Ein Versuch, dies für XHTML, MathML und SVG in einer Datei dennoch zu tun, findet man beim W3-Konsortium. Dort wird mittels im Nachhinein definierbarer Entitäten die Möglichkeit geschaffen, Präfixe für jedes Dokument neu zu bestimmen.

Siehe auch 
 Namensraum
 Extensible Markup Language (XML)
 Liste der XML-Namensräume

Einzelnachweise

Weblinks 
 W3C-Spezifikation zu Namensräumen (englisch)
 Deutsche Übersetzung der Spezifikation
 Erläuterung von XML-Namensräumen (deutsch)
 Namensraum-Tutorial bei zvon.org (englisch)
 XML Namespaces FAQ (englisch)
 Understanding Namespaces bei MSDN (englisch)

XML

ja:Extensible Markup Language#XML名前空間