# 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 Version sowohl für XML 1.0 als auch für XML 1.1 vor. Die zweite Version wurde am 16. August 2006 veröffentlicht. 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).

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

### 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:
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
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
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):
| Attribut | Bedeutung | Beispiel |
| xml:lang | Sprachangaben zum Inhalt. Durch ISO 3166 und ISO 639 definiert. Werte: 2-stelliger Sprachcode optional gefolgt von Bindestrich sowie großgeschriebenem 2-stelligen Ländercode. Ausnahme: nicht-standardisierte Länder- und Sprachcodes. | <p xml:lang="de"> Inhalt in deutscher Sprache, Land: undefiniert </p> <p xml:lang="en-US"> Inhalt in englischer Sprache, Land: Vereinigte Staaten </p> <p xml:lang="sindarin-MITTELERDE"> Inhalt in grauelbisch, Land: Mittelerde </p> |
| xml:space | Darf die zwei Werte preserve und default annehmen. Der Wert preserve bedeutet, dass Leerzeichen und Zeilenumbrüche genau so angezeigt werden, wie sie im Quelltext der Datei stehen (wie beim <pre>-Element in HTML). Der Wert default bedeutet, dass aufeinanderfolgende Leerzeichen und Zeilenumbrüche zu einem einzigen Leerzeichen zusammengefasst werden (Voreinstellung). | <div xml:space="default"> ASCII-Art: <p xml:space="preserve"> ¦\ _,,,---,,_ /,`.-'`' -. ;-;;,_ ¦,4- ) )-,_..;\ ( `'-' '---(_/--' `-'\_) fL </p> </div> |
| xml:base | Basis-URL, von der aus alle relativen Links in dem Element ausgewertet werden. | <h3>Wikipedia-Links</h3> <ul xml:base="http://de.wikipedia.org/wiki/"> <li><a href="XML">XML</a></li> <li><a href="SGML">SGML</a></li> </ul> |
| xml:id | Dokumentweit eindeutiger Bezeichner für das Element | <p xml:id="Kapitel_1">Ein Absatz</p> <p><a href="#Kapitel_1">Link zum obigen Absatz</a></p> |

### 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:
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.

## 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:
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.