Ein XML-Namensbereich ist eine Gruppe von Namen, die durch eine URI identifiziert und in XML-Dokumenten als Elementtypen und Attributnamen verwendet werden.
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.
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>
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.
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.
<?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.
Mit diesem XML-Schema wird dieses Attribut hinzugefügt:
xmlns:xsd="http://www.w3.org/2001/XMLSchemaDies 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>
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>
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>