Een XML-naamruimte is een verzameling namen die wordt aangegeven met een URI-verwijzing en die in XML-documenten wordt gebruikt als elementtypen en kenmerknamen.
Het xmlns-kenmerk heeft de volgende syntaxis:
xmlns:prefix=namespace
waarbijnamespace een unieke URI (zoals www.ibm.com) is en waarbij prefix de naamruimte vertegenwoordigt en hiervoor een aanwijzer aanlevert.
In de volgende klantelementdefinitie wordt een accountnaamruimte gedefinieerd om een onderscheid te kunnen maken tussen de elemententags en de tags die verschijnen in klantenrecords die gemaakt zijn met andere bedrijfstoepassingen.
<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>
Met de naamruimtedefinitie in de eerste regel wordt de naamruimte http://www.my.com/acct-REV10 toegewezen aan de prefix. Deze prefix wordt gebruikt op de elementnamen zoals de naam om deze te koppelen aan de naamruimte. Een tweede toepassing, bijvoorbeeld een uitvoeringssysteem, kan een andere naamruimte aan de klantelementen toewijzen:
<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>
Een toepassing die beide gegevensstructuren verwerkt, is nu in staat om de accountgegevens en de uitvoeringsgegevens verschillend te behandelen. Er is een standaard-naamruimte. Deze wordt ingesteld als er geen lokale naam is toegewezen in de naamruimtedefinitie.
<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 dit voorbeeld mogen alle tags in het klantrecord voorkomen in de naamruimte http://www.my.com/acct-REV10. Er is geen expliciete prefix vereist omdat de standaardnaamruimte wordt gebruikt. Onthoud dat de standaard-naamruimte van toepassing is op elke kenmerkdefinitie.
In het volgende XML-schema wordt de standaardnaamruimte voor het schema gedefinieerd als de standaard-XML-schemanaamruimte http://www.w3.org/2001/XMLSchema; er bestaat ook een schemaspecifieke naamruimtehttp://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>
Ervan uitgaande dat het voorgaande XML-schema is opgeslagen als C:\temp\TestSchema.xsd, ziet een voorbeeld-XML-bestand dat wordt gevalideerd op basis van dit schema er als volgt uit:
<?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>
De doelnaamruimte dient om de naamruimte aan te geven waarin de koppeling tussen het element en de naam voorkomt. In het geval van declaraties, bepaalt deze koppeling de naamruimte van de elementen in XML-bestanden die aan het schema voldoen. Een XML-bestand dat een schema importeert, moet naar de doelnaamruimte verwijzen in het kenmerk schemaLocation. Eventuele discrepanties tussen het doel en de werkelijke naamruimte van een element worden gerapporteerd als schemavalidatiefouten. In ons voorbeeld is de doelnaamruimte http://www.ibm.com; het is gedefinieerd in het XML-schemabestand en er wordt twee keer naar verwezen in het XML-bestand. Elke discrepantie tussen deze drie versies van de naamruimte leidt tot validatiefouten.
In de volgende voorbeelden wordt aangetoond hoe doelnaamruimten en naamruimteprefixen werken in XML-schema's en de bijbehorende XML-instancedocumenten.
Het 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>
Een geldig XML-instancedocument dat gemaakt is met dit schema ziet er als volgt uit. Lokale elementen en kenmerken zijn niet gekwalificeerd.
<?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>
Als lokale elementen (zoals het element "name") en kenmerken niet gekwalificeerd zijn in een XML-bestand, is alleen het hoofdelement gekwalificeerd. In dit voorbeeld wordt de naamruimteprefix "x" dus toegewezen aan het hoofdelement "MyAddress", waardoor het gekoppeld wordt aan de naamruimte "http://www.ibm.com", maar de prefix "x" is niet toegewezen aan het lokale element "name".
<?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>
Een geldig XML-instancedocument dat gemaakt is met dit schema ziet er als volgt uit. Lokale elementen en kenmerken zijn gekwalificeerd Dit komt omdat het kenmerk elementFormDefault is ingesteld op gekwalificeerd in het XML-schema.
<?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 dit voorbeeld wordt de naamruimteprefix "x" toegewezen aan zowel het hoofdelement "MyAddress" als het lokale element "name", waardoor deze gekoppeld worden aan de naamruimte "http://www.ibm.com",.
Door dit XML-schema wordt dit kenmerk toegevoegd:
xmlns:xsd="http://www.w3.org/2001/XMLSchemaDit betekent dat alle constructs die zijn gedefinieerd met de XML-schemataal moeten worden gekwalificeerd met de prefix "xsd". Bijvoorbeeld: xsd:complexType en xsd:string
. Onthoud dat u elke andere prefix zoals "xs" of "foobar" kunt kiezen in uw declaratie en gebruik.
U kunt deze prefix opgeven op de voorkeurenpagina van het XML-schema. Voor meer informatie raadpleegt u de gerelateerde taken.
Alle door de gebruiker gedefinieerde typen maken deel uit van de naamruimte http://www.ibm.com zoals gedefinieerd is in het kenmerk targetNamespace, en de prefix is "x" zoals gedefinieerd is in het kenmerk xmlns:x.
<?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>
Een geldig XML-instancedocument dat gemaakt is met dit schema ziet er als volgt uit. Lokale elementen en kenmerken zijn niet gekwalificeerd.De semantiek van de kwalificatie is hetzelfde als in Voorbeeld 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>
Dit XML-schema heeft geen doelnaamruimte voor zichzelf. In dit geval wordt het sterk aangeraden dat alle XML-schemaconstructs expliciet worden gekwalificeerd met een prefix zoals "xsd". Er wordt zonder naamruimtekwalificatie naar de definities en declaraties van dit schema zoals AddressType verwezen omdat er geen naamruimteprefix is.
<?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>
Een geldig XML-instancedocument dat gemaakt is met het schema ziet er als volgt uit. Alle elementen zijn niet gekwalificeerd.
<?xml version="1.0"?> <MyAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="x.xsd"> <name>name</name> </MyAddress>
Dit is een XML-schema waarbij de doelnaamruimte de standaardnaamruimte is. Bovendien heeft de naamruimte geen naamruimteprefix.
<?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>
Een geldig XML-instancedocument dat gemaakt is met het schema ziet er als volgt uit:
<?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>