Sql-und-Xml - Home

Xml lernen

Namespace: Elemente und Attribute aus verschiedenen DTD's in einem Xml-Dokument verwenden

Für Xml ist die Integration von Daten und Meta-Daten zentral - ein Xml-Dokument enthält immer seine vollständige Selbstbeschreibung. Dies legt es nahe, die zugehörigen DTD's auszulagern und sie möglichst häufig wiederzuverwenden, damit nicht DTD's mehrfach erstellt werden, welche denselben Inhalt beschreiben. Werden für ein größeres Projekt jedoch mehrere DTD's gemeinsam benötigt, welche von verschiedenen Personen eigenverantwortlich betreut werden, so kann es sein, daß die Eindeutigkeit der Elementnamen nicht mehr gewährleistet ist. Eine DTD für Bücher kennt das Element 'title' (für den Buchtitel), eine DTD für Veranstaltungen verwendet ein namensgleiches Element 'title' für den Titel einer Veranstaltung. Dort steht der Wert nicht im Element-Content, sondern ist als Attribut definiert. Eine Gesamtdarstellung soll beide DTDs gemeinsam verwenden, etwa um für Veranstaltungen Literaturempfehlungen zusammenzustellen. Wird nun das Element 'title' verwendet, so kann zunächst nicht unterschieden werden, ob es sich um ein Element aus dem Bereich der Bücher oder um ein Element handelt, welches einen Veranstaltungstitel beschreibt. Soll der Inhalt dieses Xml-Dokuments etwa für eine Html-Darstellung transformiert werden und sind für Veranstaltungen und Bücher verschiedenartige Designs notwendig, so scheitert dies, falls die Elemente namensgleich sind.

Um die bei diesen Aufgabenstellungen auftretenden Namenskonflikte zu lösen, verwendet Xml das Konzept der Namespace-Declaration. Ein Element wird nicht unmittelbar mit seinen lokalen Namen, sondern mit einem vorgestellten Präfix, gefolgt von einem Doppelpunkt und dem lokalen Namen, verwendet. Das Präfix wird beim ersten Auftreten mit dem speziellen Attribut xmlns definiert und ihm ein URI, eine eindeutige Adresse zugeordnet. Damit gehört das Element zum Kontext dieser Adresse, die Adresse deklariert einen Namensraum und ordnet diesem für den aktuellen Gültigkeitsbereich das verwendete Präfix zu. So lassen sich verschiedene Namespaces mit verschiedenen Präfixes in einem Xml-Dokument definieren und gleichzeitig verwenden. Das Element 'title' für Bücher mag nun 'b:title', das Element 'title' für Veranstaltungen 'v:title' heißen. Damit ist jeder qualified Name, zusammengesetzt aus Präfix, Doppelpunkt und lokalem Namen, innerhalb dieses Dokuments eindeutig gekennzeichnet.

Zuordnung zwischen Präfix und Namespace

Vorbemerkung: Die Beispiele stehen in der Codeansicht sowie per Verweis zur Verfügung. Prüft der Browser das Xml-Dokument auf seine Namespace-Deklarationen, so können Sie sich die Datei lokal kopieren und bei einem Element das Präfix durch ein nicht definiertes Präfix ersetzen. Dann erhalten Sie Fehlermeldungen der Form: 'Verweis auf ein nicht deklariertes Namespace-Präfix' (IE6). Firebird (0.7) und Opera (7.23) geben hier leider keine Fehlermeldungen aus.
  • Für eine Namespace-Deklaration als Attribut eines Elementes gibt es zwei Möglichkeiten:
    xmlns='URI'
    xmlns:PREFIX='URI'
    xmlns ist ein vordefiniertes NMTOKEN, wird es als Attribut verwendet, wird anschließend der Standard-Namespace deklariert. Oder es folgt ein ':', gefolgt von einem Präfix und der URI. Dann werden die Elemente, welche zu diesem Namespace gehören, anschließend durch das Präfix kenntlich gemacht.
  • Deklaration eines Default-Namespace ohne Präfix:
    <?xml version='1.0'?>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    	<head>
    		<title>Titel des ersten Namespace-Beispiels</title>
    	</head>
    
    <body>
    	weitere body-Elemente dieser Seite
    </body>
    
    </html>
    
    Diese Version namespace-default.xml definiert für das Element 'html' den Standard-Namespace. Alle Unterelemente, für die keine weiteren Festlegungen getroffen werden, sind damit diesem Namespace zugeordnet.
  • Namespace mit Präfix und Überschreibung im Unterelement:
    <?xml version='1.0'?>
    
    <h:html xmlns:h="http://www.w3.org/1999/xhtml">
      <h:head>
        <h:title>Namespace-Deklaration - Beispiel 2</h:title>
      </h:head>
    
    <h:body>
    
    	<!-- weitere body-Elemente dieser Seite -->
    
    	<h:a h:href='http://www.w3.org/TR/xml-names/'>
    
    		<!-- hier verweist das Präfix h
    		auf 'http://www.w3.org/TR/xml-names/', der
    		erste Wert wird überschrieben -->
    
    		Xml-Recommendation
    	</h:a>
    
    	<!-- Hier ist die Überschreibung wieder aufgehoben -->
    
    </h:body>
    
    </h:html>
    
    In der Datei namespace-with-prefix.xml wird nach dem Schlüsselwort 'xmlns' das Präfix festgelegt, welches für alle Elemente verwendet wird, die zu diesem Namespace, nicht jedoch zum Standardnamespace gehören. Letzterer ist hier nicht definiert. Alle Unterelemente von 'h:html' werden durch eine Kombination aus 'h:' sowie dem üblichen Elementnamen bezeichnet, dasselbe gilt für die Attribute.
  • <?xml version='1.0'?>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
      <head>
    	<title>Namespace-Verwendung - 3</title>
      </head>
    
    <body
      xmlns:b='http://www.sql-und-xml.de/xml-samples/books-small.dtd'
      xmlns:e='http://www.sql-und-xml.de/xml-samples/events-small.dtd'>
    
    	<b:books>
    		<b:book>
    			<b:title>Reisen in Frankreich</b:title>
    			<b:author>Mustermann, Max</b:author>
    		</b:book>
    	</b:books>
    
    	<e:events>
    		<e:event>
    			<e:title value='Monatstreffen'/>
    			<e:room>K 202-5</e:room>
    		</e:event>
    	</e:events>
    
    	<!-- weitere body-Elemente dieser Seite -->
    
    </body>
    
    </html>
    Im Xml-Dokument namespace-import.xml wird zunächst der Standard-Namespace mit 'xmlns' definiert, alle Elemente und Attribute ohne Präfix gehören zu diesem. Im zum Standard-Namespace gehörenden body-Element werden zwei weitere Namespaces deklariert - b für die books-small.dtd sowie e für die events-small.dtd. Anschließend können alle Elemente aus diesen verschiedenen Namensräumen verwendet werden und sind dennoch eindeutig zuzuordnen.
  • Bei dem angegebene Uniform Ressource Locator (URI) muß nur sichergestellt sein, daß dieser eindeutig ist, daß also der Verfasser der zugeordneten Teil-DTD sicherstellen kann, daß niemand anderes diese URI (= Adresse) für seine Namespace-Declaration verwendet. Für einen 'privaten Namespace' lassen sich damit auch Mailadressen oder Unterverzeichnisse innerhalb einer Domain verwenden. Diese müssen nicht existieren und werden auch nicht überprüft. Anstelle der beiden obigen DTD könnten also auch 'books-small' oder 'events-small', ebenso mit Endungen '.doc', 'htx' oder ähnlichem stehen. Entscheidend ist nur, daß einem Präfix eine weltweit eindeutige Adresse zugeordnet werden kann. Oftmals werden jedoch kleine Text- oder Xml-Dokumente unter diesen Adressen abgelegt, um http-404 - not found - Fehlermeldungen zu vermeiden.
  • Beachten Sie, daß keinem dieser Xml-Dokumente eine DTD zugeordnet wurde. Näheres zu dieser Problematik erfahren Sie im nächsten Abschnitt.

© 2003-2016 Jürgen Auer, Berlin.