XML-navneområder

Et XML-navneområde er en samling med navn som identifiseres ved en URI-referanse, og som brukes i XML-dokumenter som elementtyper og attributtnavn.

XML-navneområder er definert ved en W3C-anbefaling datert 14. januar 1999 kalt Namespaces in XML. XML-kodenavn må være globalt unike og korte av hensyn til ytelsen. For å løse denne konflikten definerer W3C-anbefalingen et attributt, xmlns, som kan endre ethvert XML-element. Hvis det finnes i et element, identifiserer det navneområdet for dette elementet.

xmlns-attributtet har følgende syntaks:

xmlns:prefiks=navneområde

der navneområde er en unik URI (f.eks. www.ibm.com), og der prefiks representerer navneområdet og peker på det.

I følgende kundeelementdefinisjon er det definert et regnskapsnavneområde for å gjøre det mulig å skille elementkodene fra dem som er oppført i kunderegistre opprettet av andre forretningsapplikasjoner:

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

Navneområdedefinisjonen i den første linjen tildeler http://www.my.com/acct-REV10 til prefikset. Dette prefikser brukes på elementnavn som navn for å knytte dem til navneområdet. En annen bruk, f.eks. et oppfyllelsessystem, kan tildeles et annet navneområde til sine kundeelementer:

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

En applikasjon som behandler begge datastrukturene, kan nå behandle regnskap og oppfyllelsesdata forskjellig. Det er et standardnavneområde. Det brukes hvis ikke noe lokalt navn tildeles i navneområdedefinisjonen:

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

I dette eksempelet er alle koder i kunderegisteret kvalifisert til å være i navneområdet http://www.my.com/acct-REV10. Ikke noe eksplisitt prefiks trengs, for standard navneområde brukes. Merk at standard navneområde gjelder for alle attributtdefinisjoner.

XML-skjemaer og navneområder

I XML-skjemaet nedenfor er standard navneområde for skjemaet definert som standard navneområde http://www.w3.org/2001/XMLSchema for XML-skjemaet. Det er også et skjemaspesifikt navneområde, 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>  

Hvis vi antar at forrige XML-skjema ble lagret som C:\temp\TestSchema.xsd, får vi et XML-fileksempel som validerer mot dette skjemaet:

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

Målnavneområde

Målnavneområdet identifiserer navneområdet som tilknytningen mellom elementet og navnet finnes innenfor. For deklarasjoner bestemmer denne tilknytningen navneområdet for elementene i XML-filer som er i samsvar med skjemaet. En XML-fil som importerer et skjema, må referere til målnavneområdet i attributtet schemaLocation. Manglende samsvar mellom målnavneområde og faktisk navneområde for et element rapporteres som skjemavalideringsfeil. I vårt eksempel er målnavneområdet http://www.ibm.com; det er definert i XML-skjemafilen og referert til to ganger i XML-filen. Manglende samsvar mellom disse tre forekomstene av navneområdet fører til valideringsfeil.

Eksemplene nedenfor viser hvordan målnavneområder og navneområdeprefikser virker i XML-skjemaer og deres tilsvarende XML-forekomstdokumenter.

Eksempel 1 - Et skjema med både standard- og målnavneområde og ukvalifiserte lokale

XML-skjema:

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

Et gyldig XML-forekomstdokument opprettet ut fra dette skjemaet ser slik ut. Lokale elementer og attributter er ukvalifisert.

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

Når lokale elementer (f.eks. elementet "name") og attributter er ukvalifisert i en XML-fil, er bare rotelementet kvalifisert. Så i vårt eksempel tildeles navneområdet "x" til rotelementet "MyAddress" og knytter det til navneområdet "http://www.ibm.com", men prefikset "x" er ikke tildelt til det lokale elementet "name".

Eksempel 2 - Et skjema med både standard- og målnavneområde og kvalifiserte lokale

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

Et gyldig XML-forekomstdokument opprettet ut fra dette skjemaet ser slik ut. Lokale elementer og attributter er kvalifisert. Det er fordi attributtet elementFormDefault er satt til kvalifisert i XML-skjemaet.

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

I dette eksempelet tildeles navneområdeprefikset "x" til både rotelementet "MyAddress" og det lokale elementet "name" og knytter dem til navneområdet "http://www.ibm.com".

Eksempel 3 - Skjema med målnavneområde som eksplisitt definerer xmlns:xsd

Dette XML-skjemaet legger til dette attributtet:

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

Dette betyr at hver av setningene som er definert ved XML-skjemaspråket, må kvalifiseres med prefikset "xsd". For eksempel xsd:complexType og xsd:string

. Merk at du kan velge et hvilket som helst annet prefiks, for eksempel "xs" eller "foobar" i deklarasjonen og bruken.

Du kan oppgi dette prefikset på preferansesiden for XML-skjemaet. Du finner flere opplysninger i beslektede oppgaver.

Alle brukerdefinerte typer tilhører navneområdet http://www.ibm.com som definert ved attributtet targetNamespace, og prefikset er "x" som definert ved attributtet 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>

Et gyldig XML-forekomstdokument opprettet ut fra dette skjemaet ser slik ut. Lokale elementer og attributter er ukvalifisert. Semantikken i kvalifikasjonen er den samme som i eksempel 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>

Eksempel 4 - Skjema med udeklarert målnavneområde som eksplisitt definerer xmlns:xsd

Dette XML-skjemaet har ikke noe eget målnavneområde. I dette tilfellet anbefales det på det sterkeste at alle XML-skjemasetninger eksplisitt kvalifiseres med et prefiks som for eksempel "xsd". Definisjonene og deklarasjonene fra dette skjemaet som for eksempel AddressType refereres uten navneområdekvalifikasjon, siden det ikke finnes noe navneområdeprefiks.

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

Et gyldig XML-forekomstdokument opprettet ut fra dette skjemaet ser slik ut. Alle elementer er ukvalifisert.

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

Eksempel 5 - Et skjema der målnavneområdet er standard navneområde

Dette er et XML-skjema der målnavneområdet er standard navneområde. Dessuten har navneområdet ikke noe navneområdeprefiks.

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

Et gyldig XML-forekomstdokument opprettet ut fra dette skjemaet ser slik ut:

<?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>  
Beslektede oppgaver
Redigere preferanser for XML-skjemaer