XML-Namensräume

(Auszug aus "Newsfeeds mit RSS und Atom" von Heinz Wittenbrink, erschienen bei Galileo Press, 2005)

Der Namensraum-Mechanismus gilt als kompliziert – zu Unrecht, denn er beruht auf einem einfachen Prinzip. Es besteht darin, die Namen, die in einem XML-Dokument verwendet werden, eindeutig einem XML-Vokabular zuzuordnen. Dieses Vokabular bildet den "Namensraum", zu dem die Namen gehören, die man auf ihn bezieht.

In einem XML-Dokument werden Namen für Elemente und Attribute verwendet. Der Name eines Elements steht zwischen den spitzen Klammern der Tags, der Name der Attribute innerhalb der Tags vor einem Gleichheitszeichen. In dem Beispiel

<?xml version="1.0"?>
<feed version="0.8">
   <head></head>
</feed> 

sind feed und channel die Namen von zwei Elementen. (Es ist nicht korrekt, von einem feed- oder head-Tag zu sprechen, wenn man das ganze Element als Container meint.) Man sagt auch: Ein Element hat den Namen feed oder ein Element ist vom Typ feed. Die Zeichenkette version innerhalb des Starttags des Elements feed ist ein Attributname.

Bei diesen Element- und Attributnamen handelt es sich um sogenannte lokale Namen. Aus den Namen selbst lässt sich nicht entnehmen, zu welchem Vokabular sie gehören. Eine Anwendung, der dieses Dokument übergeben wird, kann nicht entscheiden, ob es sich z. B. um ein Atom-Dokument handelt oder nicht.

Um eindeutig auszudrücken, wie die Namen feed und head zu verstehen sind, muss man sie "qualifizieren". Für diese Qualifikation sorgt man, indem man die Elementbezeichner ausdrücklich auf den Namensraum bezieht, zu dem sie gehören. Diese Zuordnung nimmt man durch das Attribut xmlns vor. Der Wert dieses Attributs ist ein URI. Im folgenden Beispiel

<?xml version="1.0"?>
<feed version="0.8" xmlns="http://purl.org/atom/ns#draft-ietf-atompub-format-04">
   <head></head>
</feed> 

wird das Attribut xmlns für die sogenannte Deklaration eines Namensraums verwendet. feed und head gelten in Folge als qualifizierte Namen, denn der deklarierte Namensraum gilt sowohl für das Element selbst, in dem die Deklaration erfolgt, als auch für alle Elemente, die sich in dessen Inneren befinden. (Es sei denn, wie wir gleich sehen werden, einer der Nachkommen ist einem eigenen Namensraum zugeordnet.)

Global eindeutige Bezeichner

Um diese Qualifikation deutlich zu machen, können wir die Elementbezeichner in ihrer sogenannten expandierten Form auch folgendermaßen schreiben (dabei handelt es sich nicht um gültiges XML, sondern nur um eine didaktische Verdeutlichung, sie folgt XML Namespaces von James Clark:

<?xml version="1.0"?>
<{http://purl.org/atom/ns#draft-ietf-atompub-format-04}feed {http://purl.org/atom/ns#draft-ietf-atompub-format-04}version="0.4">
   <{http://purl.org/atom/ns#draft-ietf-atompub-format-04}head></{http://purl.org/atom/ns#draft-ietf-atompub-format-04}head>
</{http://purl.org/atom/ns#draft-ietf-atompub-format-04}feed> 

Bei diesen qualifizierten Namen handelt es sich nicht mehr um lokale, sondern um global eindeutige Namen.

Der Grund dafür ist einfach: Ein URI, wie in unserem Fall "http://purl.org/atom/ns#draft-ietf-atompub-format-08", ist global eindeutig; er hat in jedem beliebigen Dokument dieselbe Bedeutung. Dazu ist es nicht einmal erforderlich, dass sich unter der Adresse, die hier als URI verwendet wird, tatsächlich ein Dokument befindet. Die Regeln für die Vergaben von Namen im Internet sorgen dafür, dass dieser Identifizierer nicht mit unterschiedlicher Bedeutung verwendet wird.

Vermeidung von Namenskonflikten

Wir können nun in unser Dokument ein Element aus einem anderen Namensraum einfügen. Wir verwenden dazu ein Element aus der XML-Version des sogenannten Dublin Core. Das Dublin Core Metadata Element Set wurde von Bibliothekaren als Vokabular für bibliografische Angaben im Netz entwickelt. Es lässt sich mit allen hier vorgestellten Syndikationsvokabularen kombinieren. Für unser Beispiel wählen wir das Element mit dem Namen author, das zu diesem Vokabular gehört, und setzen es zunächst ohne Angabe des Namensraums in unser Dokument ein:

<?xml version="1.0"?>
<feed version="0.8" xmlns="http://purl.org/atom/ns#draft-ietf-atompub-format-04">
   <head>
      <author>James Clark</author>
   </head>
</feed> 

So geschrieben, ist das Element für eine Anwendung, die Atom-Daten verarbeiten kann, nicht als Dublin Core-Element zu erkennen. Auch zu Atom gehört ein Element mit dem Namen author; den Inhalt dieses Elements müssen allerdings weitere Elemente bilden, zu denen in jedem Fall ein Element mit dem Namen name gehören muss, wie in dem folgenden Beispiel:

<?xml version="1.0"?>
<feed version="0.8" xmlns="http://purl.org/atom/ns#draft-ietf-atompub-format-08">
   <head>
      <author>
         <name>James Clark</name>
      </author>
   </head>
</feed> 

Wenn wir festlegen wollen, dass wir das Element author aus dem Dublin Core-Vokabular statt des gleichnamigen Atom-Elements verwenden wollen, müssen wir es dem Namensraum dieses Vokabulars zuordnen, wie in dem folgenden Code-Beispiel:

<?xml version="1.0"?>
<feed version="0.8" xmlns="http://purl.org/atom/ns#draft-ietf-atompub-format-04">
   <head>
      <author xmlns="http://purl.org/dc/elements/1.1/">James Clark</author>
   </head>
</feed>

In unserer didaktischen Schreibweise mit vorangestellten URIs sähe dieses Dokument so aus:

<?xml version="1.0"?>
<{http://purl.org/atom/ns#draft-ietf-atompub-format-04}feed {http://purl.org/atom/ns#draft-ietf-atompub-format-04}version="0.8">
   <{http://purl.org/atom/ns#draft-ietf-atompub-format-08}head>
      <{http://purl.org/dc/elements/1.1/}author>James Clark</{http://purl.org/dc/elements/1.1/}author>
   </{http://purl.org/atom/ns#draft-ietf-atompub-format-08}head>
</{http://purl.org/atom/ns#draft-ietf-atompub-format-08}feed> 


Das Element author ist jetzt auch qualifiziert, sodass es mit dem Element author aus dem Atom-Vokabular nicht verwechselt werden kann. Beide Elemente haben denselben lokalen Namen, aber nicht den qualifizierten Namen. Sie lassen sich also sogar wie in dem folgenden Beispiel miteinander kombinieren:

<?xml version="1.0"?>
<feed version="0.8" xmlns="http://purl.org/atom/ns#draft-ietf-atompub-format-04">
   <head>
      <author>
         <name>James Clark</name>
      </author>
      <author xmlns="http://purl.org/dc/elements/1.1/">James Clark</author>
   </head>
</feed> 

Eine Anwendung, die nur Atom-Elemente versteht, kann in diesem Dokument das Dublin Core-Element author ignorieren. Eine Dublin Core-fähige Anwendung kann dagegen erkennen, dass hier der Name eines Autors gemäß diesem Standard genannt ist.

Das ist (fast) alles! Wir haben die Grundlagen des Namensraum-Mechanismus dargestellt. Probleme für viele Benutzer und auch die Entwickler von Anwendungen ergeben sich daraus, dass man die Zuordnung zu Namensräumen auch mit Abkürzungen vornehmen kann, um nicht immer wieder das Attribut xmlns mit einem URI als Wert wiederholen zu müssen.

Man kann stattdessen definieren, dass eine bestimmte Zeichenkette dieses Attribut samt einem seiner Werte vertritt. In der folgenden Version unseres Beispiels benutzen wir solche Abkürzungen für beide Namensräume:

<?xml version="1.0"?>
<atom:feed version="0.8" xmlns:atom="http://purl.org/atom/ns#draft-ietf-atompub-format-04" xmlns:dc="http://purl.org/dc/elements/1.1/">
   <atom:head>
      <atom:author>
         <atom:name>James Clark</atom:name>
      </atom:author>
      <dc:author>James Clark</dc:author>
   </atom:head>
</atom:feed> 

Für XML-Dokumente, in denen Elemente oder Attribute aus verschiedenen Namensräumen vorkommen, wird in der Regel diese Schreibweise benutzt. Die Namen bestehen aus einem Präfix, einem Doppelpunkt und dann dem lokalen Namen. Es ist auch möglich, im Dokument-Element eines Dokuments einen Default-Namensraum mit dem Attribut xmlns festzulegen; dieser Namensraum ist dann für alle Elemente gültig, die nicht mit einem Präfix ausgestattet sind. Wir können das Dokument aus dem letzten Beispiel also auch so schreiben:

<feed version="0.8" xmlns="http://purl.org/atom/ns#draft-ietf-atompub-format-08" xmlns:dc="http://purl.org/dc/elements/1.1/">
   <head>
      <author>
         <name>James Clark</name>
      </author>
      <dc:author>James Clark</dc:author>
   </head>
</feed> 

Für einen XML-Parser, also eine Applikation, die einem XML-Dokument Informationen zur Weiterverarbeitung entnimmt, bedeuten diese Versionen dasselbe. Man sagt auch: Sie haben denselben Infoset. Die Informationen, die sich ihnen entnehmen lassen, sind identisch. Lediglich in der "Serialisierung", der Darstellung der Informationen in aufeinander folgenden Zeichen, unterscheiden sie sich.

Die Bedeutung eines Namensraum-Präfixes beruht nur darauf, dass es einen lokalen Namen mit einem URI verbindet. Welches Präfix gewählt wird, ist beliebig und grundsätzlich dem Autor eines Dokuments überlassen. Das folgende Beispiel repräsentiert denselben Infoset wie das letzte Beispiel, auch wenn es andere Zeichenketten als Präfixe benutzt:

<atom:feed version="0.4" xmlns:syndication="http://purl.org/atom/ns#draft-ietf-atompub-format-04" xmlns:metadata="http://purl.org/dc/elements/1.1/">
   <syndication:head>
      <syndication:author>
         <syndication:name>James Clark</syndication:name>
      </syndication:author>
      <metadata:author>James Clark</metadata:author>
   </syndication:head>
</atom:feed>

Um es noch einmal zu wiederholen: Diese Präfixe haben für einen XML-Parser keine andere Bedeutung, als die lokalen Namen einem URI zuzuordnen; es ist Aufgabe dieses URI, den gültigen Namensraum zu identifizieren. In der Praxis haben sich allerdings bestimmte Präfixe, z. B. dc für den Dublin Core oder xsl für XSLT-Stylesheets durchgesetzt.

Allerdings kann man leider nicht davon ausgehen, dass jedes RSS- oder Atom-Dokument von einer Anwendung verarbeitet wird, die einen vollständigen XML-Parser besitzt. Vielfach werden die Dokumente nicht so geparst, dass der Infoset vollständig repräsentiert und weitergegeben wird. Viele RSS-Anwendungen erkennen nur ein festes Vokabular und interpretieren qualifizierte Namen wie lokale Namen. Aus diesem Grund werden in einigen RSS-Standards Namensraum-Präfixe festgelegt, z. B. bei den Modulen, durch die sich RSS 1.0 erweitern lässt. Man tut als Autor und Entwickler in jedem Fall gut daran, die eingeführten Namensraum-Präfixe zu verwenden, auch wenn das aus der reinen XML-Sicht nicht notwendig wäre.

Die Formate, die hier ausführlich vorgestellt werden, verwenden alle den XML-Namensraum-Mechanismus. RSS 2.0 wurde allerdings ohne eigenen Namensraum definiert. Die älteren Syndikationsformate (RSS 0.9x) benutzen diese Technik noch nicht. XML-Namensräume sind die wichtigste Voraussetzung dafür, XML-Vokabulare zu erweitern.

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Newsfeeds mit RSS und Atom bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an: