# XML-Namensräume

| Universelle Eindeutigkeit von Elementen und Attributen Dateninseln mit Namensraum definieren Mehrere Namensräume gleichzeitig verwenden

## Universelle Eindeutigkeit von Elementen und Attributen

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-html-40">
        <head><title>Einleitung</title></head>
        <body>
         <h1>Einleitung</h1>
         <p>Das Buch beginnt mit diesem Text...</p>
        </body>
       </html>
    </kapitel>
    </buch>

### Erläuterung:

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-html-40` 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:

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

### Erläuterung:

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.

| Zeichen, Zeichenkodierungen und nicht interpretierte Abschnitte
| Baumstruktur und Knoten einer XML-Datei

© 2007 Impressum