XML-Namensbereiche

Ein XML-Namensbereich ist eine Gruppe von Namen, die durch eine URI identifiziert und in XML-Dokumenten als Elementtypen und Attributnamen verwendet werden.

XML-Namensbereiche werden durch eine W3C-Empfehlung vom 14. Januar 1999 definiert, die den Titel Namespaces in XML hat. XML-Tagnamen müssen global eindeutig, sollten aus Gründen der Leistung jedoch kurz sein. Um diesen Konflikt zu lösen, definiert die W3C-Empfehlung für Namensbereiche das Attribut xmlns, das als Zusatz zu jedem XML-Element hinzugefügt werden kann. Ist dieses Attribut in einem Element vorhanden, identifiziert es den Namensbereich für das jeweilige Element.

Syntax des Attributs "xmlns":

xmlns:prefix=namespace

Dabei ist namespace eine eindeutige URI (z. B. www.ibm.com); prefix stellt den Namensbereich dar und enthält einen entsprechenden Verweis.

In der folgenden "customer"-Elementdefinition wird ein Namensbereich "accounting" (acct) definiert, um die Elementtags von denen unterscheiden zu können, die in Kundendaten enthalten sind, die von anderen Geschäftsanwendungen erstellt wurden:

<acct:customer xmlns:acct="http://www.my.com/acct-REV10">
	<acct:name>Corporation</acct:name>
	<acct:order acct:ref="5566"/>
	<acct:status>invoice</acct:status>
</acct:customer>  

Durch die Namensbereichsdefinition in der ersten Zeile wird der Namensbereich http://www.my.com/acct-REV10 dem Präfix zugeordnet. Dieses Präfix wird für die Elementnamen, wie z. B. "name", verwendet, um sie dem Namensbereich zuzuordnen. Eine zweite Anwendung, wie beispielsweise ein Auftragserfüllungssystem, kann ihren "customer"-Elementen einen anderen Namensbereich zuordnen:

<ful:customer xmlns:ful="http://www.your.com/ful">
	<ful:name>Corporation</ful:name>
	<ful:order ful:ref="A98756"/>
	<ful:status>shipped</ful:status>
 </ful:customer>

Eine Anwendung, die beide Datenstrukturen verarbeitet, kann nun die Abrechnungsdaten und die Auftragserfüllungsdaten unterschiedlich behandeln. Es gibt einen Standardnamensbereich. Er wird verwendet, wenn kein lokaler Name in der Namensbereichsdefinition zugeordnet ist:

<acct:customer xmlns="http://www.my.com/acct-REV10" xmlns:acct="http://www.my.com/acct-REV10 ">
<name>Corporation</name>
<order acct:ref="5566"/>
<status>invoice</status>
</customer>

In diesem Beispiel sind alle Tags des "customer"-Satzes so qualifiziert, dass sie sich im Namensbereich http://www.my.com/acct-REV10 befinden. Es ist kein explizites Präfix erforderlich, da der Standardnamensbereich verwendet wird. Beachten Sie, dass der Standardnamensbereich für alle Attributdefinitionen gültig ist.

XML-Schemata und Namensbereiche

Im folgenden XML-Schema ist der Standardnamensbereich des Schemas als Standardnamensbereich für XML-Schemata http://www.w3.org/2001/XMLSchema definiert; darüber hinaus gibt es einen schemaspezifischen Namensbereich http://www.ibm.com.

<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:TestSchema="http://www.ibm.com">
 <simpleType name="ZipCodeType">
 <restriction base="integer">
  <minInclusive value="10000"/>
 <maxInclusive value="99999"/>
</restriction>
 </simpleType> 
 <!--element definitions skipped -->  
</schema>  

Angenommen, das vorhergehende XML-Schema wird als C:\temp\TestSchema.xsd gespeichert; eine XML-Beispieldatei, die auf der Basis dieses Schemas geprüft wird, ist:

<?xml version="1.0"?>
<x:addressList xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://www.ibm.com file:///C:/temp/TestSchema.xsd">
 xsi:schemaLocation="http://www.ibm.com file:///C:/temp/TestSchema.xsd">
<x:address>
 <x:street>x:Vangerowstrasse</x:street>
  <x:zipCode>69115</x:zipCode>
 <x:city>x:Heidelberg</x:city>
 </x:address>
    <x:address> 
<x:street>x:Bernal Road</x:street> 
<x:zipCode>90375</x:zipCode>
     <x:city>x:San Jose</x:city>
 </x:address>
</x:addressList> 

Zielnamensbereich

Der Zielnamensbereich dient dazu, den Namensbereich zu identifizieren, in dem sich die Zuordnung zwischen dem Element und dem Namen befindet. Im Fall von Deklarationen bestimmt diese Zuordnung den Namensbereich der Elemente in XML-Dateien, die dem Schema entsprechen. Eine XML-Datei, die ein Schema importiert, muss auf dessen Zielnamensbereich im Attribut "schemaLocation" verweisen. Abweichungen zwischen dem Zielnamensbereich und dem tatsächlichen Namensbereich eines Elements werden als Fehler bei der Schemaprüfung gemeldet. In diesem Beispiel lautet der Zielnamensbereich http://www.ibm.com; er ist in der XML-Schemadatei definiert, und in der XML-Datei wird zweimal auf ihn verwiesen. Jede Abweichung zwischen diesen drei Vorkommen des Namensbereichs führt zu Fehlern bei der Prüfung.

Die folgenden Beispiele zeigen, wie Zielnamensbereiche und Namensbereichspräfixe in XML-Schemata und den entsprechenden XML-Instanzdokumenten funktionieren.

Beispiel 1 - Schema mit einem Standard- und einem Zielnamensbereich sowie nicht qualifizierten lokalen Elementen

XML-Schema:

<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com">
<complexType name="AddressType">
<sequence>
<element name="name" type="string"></element>
</sequence>
</complexType>
<element name="MyAddress" type="x:AddressType"></element>
</schema> 

Ein gültiges XML-Instanzdokument, das aus diesem Schema erstellt wird, sieht wie folgt aus. Lokale Elemente und Attribute sind nicht qualifiziert.

<?xml version="1.0"?>
<x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com x.xsd ">
<name>Peter Smith</name>
</x:MyAddress> 

Wenn lokale Elemente (z. B. das Element "name") und Attribute in einer XML-Datei nicht qualifiziert sind, ist nur das Stammelement qualifiziert. In diesem Beispiel ist das Namensbereichspräfix "x" dem Stammelement "MyAddress" und damit dem Namensbereich "http://www.ibm.com" zugeordnet; das Präfix "x" ist jedoch nicht dem lokalen Element "name" zugeordnet.

Beispiel 2 - Schema mit einem Standard- und einem Zielnamensbereich sowie qualifizierten lokalen Elementen

<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com" elementFormDefault="qualified">
<complexType name="AddressType">
<sequence>
<element name="name" type="string"></element>
</sequence>
</complexType>
<element name="MyAddress" type="x:AddressType"></element>
 </schema>  

Ein gültiges XML-Instanzdokument, das aus diesem Schema erstellt wird, sieht wie folgt aus. Lokale Elemente und Attribute sind qualifiziert. Der Grund hierfür ist, dass das Attribut "elementFormDefault" im XML-Schema als qualifiziert definiert ist.

<?xml version="1.0"?>
  <x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.ibm.com x.xsd "> 
<x:name>Peter Smith</x:name>
 </x:MyAddress>

In diesem Beispiel ist das Namensbereichspräfix "x" sowohl dem Stammelement "MyAddress" als auch dem lokalen Element "name"; damit sind beide dem Namensbereich "http://www.ibm.com" zugeordnet.

Beispiel 3 - Schema mit Zielnamensbereich und expliziter Definition von xmlns:xsd

Mit diesem XML-Schema wird dieses Attribut hinzugefügt:

xmlns:xsd="http://www.w3.org/2001/XMLSchema

Dies bedeutet, dass jedes der Konstrukte, die durch die XML-Schemasprache definiert sind, durch das Präfix "xsd" qualifiziert werden müssen. Beispiel: xsd:complexType und xsd:string

. Sie können auch andere Präfixe, wie z. B. "xs" oder "foobar" in Ihrer Deklaration und Syntax verwenden.

Sie können dieses Präfix auf der Benutzervorgabenseite des XML-Schemas angeben. Weitere Informationen finden Sie in den zugehörigen Tasks.

Alle benutzerdefinierten Typen gehören zu dem durch das Attribut "targetNamespace" definierten Namensbereich http://www.ibm.com; das Präfix ist "x", wie durch das Attribut "xmlns:x" definiert.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns:x="http://www.ibm.com">
<xsd:complexType name="AddressType">
<xsd:sequence>
		 <xsd:element name="name" type="xsd:string"></xsd:element>
</xsd:sequence>
 </xsd:complexType>
 <xsd:element name="MyAddress" type="x:AddressType"></xsd:element>
</xsd:schema>

Ein gültiges XML-Instanzdokument, das aus diesem Schema erstellt wird, sieht wie folgt aus. Lokale Elemente und Attribute sind nicht qualifiziert. Die Semantik der Qualifizierung entspricht Beispiel 1.

<?xml version="1.0"?>
 <x:MyAddress xmlns:x="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.ibm.com x.xsd ">
<name>Peter Smith</name>
 </x:MyAddress>

Beispiel 4 - Schema mit nicht deklariertem Zielnamensbereich, der xmlns:xsd explizit definiert

Dieses XML-Schema verfügt selbst nicht über einen Zielnamensbereich. In diesem Fall wird unbedingt empfohlen, alle XML-Schemakonstrukte explizit durch ein Präfix, wie beispielsweise "xsd", zu qualifizieren. Auf die Definitionen und Deklarationen aus diesem Schema, wie z. B. AddressType, wird ohne Namensbereichsqualifizierung verwiesen, da es kein Namensbereichspräfix gibt.

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="AddressType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="name" type="xsd:string"></xsd:element>
<xsd:element name="name" type="xsd:string"></xsd:element> 
</xsd:sequence> 
</xsd:complexType>
<xsd:element name="MyAddress" type="AddressType"></xsd:element> 
</xsd:schema> 

Ein gültiges XML-Instanzdokument, das aus diesem Schema erstellt wird, sieht wie folgt aus. Alle Elemente sind nicht qualifiziert.

<?xml version="1.0"?>
<MyAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="x.xsd">
<name>name</name>
</MyAddress>

Beispiel 5 - Schema, bei dem der Zielnamensbereich der Standardnamensbereich ist

Hierbei handelt es sich um ein XML-Schema, bei dem der Zielnamensbereich der Standardnamensbereich ist. Der Namensbereich verfügt nicht über ein Namensbereichspräfix.

<?xml version="1.0"?>
 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.ibm.com" xmlns="http://www.ibm.com">
<xsd:complexType name="AddressType">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
 <xsd:element name="MyAddress" type="AddressType"></xsd:element>
 </xsd:schema> 

Ein gültiges XML-Instanzdokument, das aus diesem Schema erstellt wird, sieht wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>
<MyAddress xmlns="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com NewXMLSchema.xsd">
<name>name</name>
 </MyAddress>  
Zugehörige Tasks
Benutzervorgaben für XML-Schemadateien bearbeiten