XML/Regeln/XML-Namensräume

Aus SELFHTML-Wiki
< XML‎ | Regeln
Wechseln zu: Navigation, Suche

Ein XML-Dokument besteht im wesentlichen aus Elementen und Attributen. Durch die Zuordnung zu einer DTD gehören Elemente und Attribute dem Namensraum dieser DTD an. Fehlt jedoch die Dokumenttyp-Deklaration und das Dokument ist zwar wohlgeformt, aber nicht gültig, dann gibt es keine solche eindeutige Zuordnung. Es bleibt unklar, "woher" (aus welchem Namensraum) die verwendeten Element- und Attributnamen kommen. Dazu besteht die Möglichkeit, bei einem Elementnamen oder Attributnamen explizit einen Namensraum anzugeben.

Besonders wichtig ist die Bezeichnung des Namensraums, wenn sich Namen von Elementen oder Attributen aus unterschiedlichen Namensräumen in die Quere kommen. Angenommen, in einem XML-Dokument gibt es zweimal ein Element namens div. Einmal bezieht es sich auf einen eigenen Namensraum, und einmal soll es als HTML-Element fungieren. Nur durch die Zuordnung zu einem bestimmten Namensraum ist in dem Fall klar, in welchem "Kontext" das Element interpretiert werden soll.

Zu diesem Zweck hat das W3-Konsortium den Begriff der qualifizierten Namen (qualified names) eingeführt. Qualifizierte Namen bestehen immer aus einem Präfix, der den Namensraum bezeichnet, und einem lokalen Namensteil, der den Namen des Elements oder Attributs innerhalb des Namensraums bezeichnet. Beim Arbeiten mit mehreren Namensräumen gleichzeitig ist es wichtig, qualifizierte Namen zu notieren.

Dateninseln mit Namensraum definieren

Sie können innerhalb eines XML-Dokuments "Inseln" mit Daten aus bestimmten Namensräumen definieren.

Beispiel
<?xml version="1.0" encoding="ISO-8859-1" ?>
<buch xmlns="http://www.meinserver.de/XML/buch">
<kapitel nummer="1">
  <html xmlns="http://www.w3.org/TR/REC-html40">
    <head><title>Einleitung</title></head>
    <body>
     <h1>Einleitung</h1>
     <p>Das Buch beginnt mit diesem Text...</p>
    </body>
   </html>
</kapitel>
</buch>

Das Beispiel zeigt ein XML-Dokument. Es enthält ein Dokument-Element namens buch. In dessen Einleitungs-Tag ist eine XML-Namensraumdeklaration enthalten. Dazu wird in dem einleitenden Tag das Attribut xmlns notiert (xmlns = XML name space, also XML-Namensraum). Dahinter folgt ein URI, der angibt, auf welchen anderen Namensraum in diesem Element Bezug genommen wird. Dieser URI muss nicht unbedingt eine tatsächlich aufrufbare Adresse sein. Es handelt sich um eine reine Konvention, vergleichbar einer eindeutigen Namensvergabe. Bei eigenen XML-Sprachen können Sie diese Adressen selbst vergeben. Im Beispiel wird http://www.meinserver.de/XML/buch gewählt. Das buch-Element selbst und seine untergeordneten Elemente (Kindelemente) – z. B. das Element kapitel – beziehen sich nun auf den definierten Namensraum. Unterhalb des kapitel-Elements ist im Beispiel jedoch wieder ein Element mit Namensraumdeklaration enthalten: ein html-Element mit xmlns-Attribut. Im Fall von HTML 4.0 sieht das W3-Konsortium dazu die Angabe http://www.w3.org/TR/REC-html40 vor. Alle Kindelemente, die nun zwischen <html> und </html> stehen, gehören zum HTML-Namensraum (oder: zur HTML-Dateninsel).

Das Beispiel enthält also ineinander verschachtelte Namensräume. Seine Grobstruktur lässt sich optisch so darstellen: Namensräume

Mehrere Namensräume gleichzeitig verwenden

Beim Arbeiten mit Dateninseln sind die Namensräume durch die Elementhierarchie sauber voneinander getrennt. Es ist jedoch auch möglich, Namensräume zu mischen. Dabei müssen Sie Präfix-Angaben notieren, um den jeweils gemeinten Namensraum zuzuordnen.

Beispiel
<?xml version="1.0" encoding="ISO-8859-1" ?>
<bestellung xmlns:produkt="http://localhost/XML/produkt" xmlns:kunde="http://localhost/XML/kunde">
 <produkt:nummer>p49393</produkt:nummer>
 <produkt:name>JXY Rasierer VC100</produkt:name>
 <produkt:menge>1</produkt:menge>
 <produkt:preis>69,--</produkt:preis>
 <kunde:nummer>k2029</kunde:nummer>
 <kunde:name>Meier, Fritz</kunde:name>
 <kunde:lieferadresse>Donnerbalkenstr.14, 80111 München</kunde:lieferadresse>
</bestellung>

In dem Beispiel geht es um die Datenstruktur einer Bestellung. Eine typische Bestellung greift auf zwei verschiedene Datenbestände zu: für das bestellte Produkt auf den Produktdatenbestand, und für den Besteller auf den Kundendatenbestand. Dies kommt im Beispiel dadurch zum Ausdruck, dass im einleitenden Tag des Elements bestellung zwei Namensraumdeklarationen stehen: eine für produkt und eine für kunde. Zwischen <bestellung> und </bestellung> soll mit Elementen aus beiden Namensräumen gearbeitet werden können. Dazu werden bei den Namensraumdeklarationen Präfixe mit definiert. Anstelle eines reinen Attributs xmlns wird hier xmlns:produkt und xmlns:kunde notiert, also xmlns, gefolgt von einem Doppelpunkt und einem Namen (alles ohne Leerzeichen dazwischen). Die Namen wie im Beispiel produkt und kunde sind dabei frei wählbar. Als Wertzuweisung an das so definierte Attribut folgt ein per Konvention vergebener URI. Im Beispiel werden http://localhost/XML/produkt und http://localhost/XML/kunde gewählt.

Bei den Elementen, die innerhalb von <bestellung> und </bestellung> vorkommen, wird durch Angabe der definierten Präfixnamen auf den gewünschten Namensraum Bezug genommen. produkt:nummer nimmt beispielsweise auf den Namensraum Bezug, der mit xmlns:produkt="http://localhost/XML/produkt" definiert wurde, während kunde:nummer auf den Namensraum Bezug nimmt, der mit xmlns:kunde="http://localhost/XML/kunde" definiert wurde.