Przestrzenie nazw XML

Przestrzeń nazw XML jest kolekcją nazw identyfikowanych przez odsyłacz URI, które są używane w dokumentach XML jako typy elementów i nazwy atrybutów.

Przestrzenie nazw XML są zdefiniowane w zaleceniach W3C z 14 stycznia 1999 r. o nazwie Namespaces in XML (Przestrzenie nazw w języku XML). Nazwy znaczników XML powinny być globalnie unikalne, a także - ze względu na wydajność - krótkie. Aby rozstrzygnąć ten konflikt, zalecenia W3C dotyczące przestrzeni nazw definiują atrybut xmlns, który może zamienić dowolny element XML. Jeśli jest on obecny w elemencie, identyfikuje przestrzeń nazw tego elementu.

Atrybut xmlns ma następującą składnię:

xmlns:przedrostek=przestrzeń_nazw

gdzie przestrzeń_nazw jest unikalnym identyfikatorem URI (na przykład www.ibm.com), a przedrostek reprezentuje przestrzeń nazw i stanowi wskaźnik do niej.

W poniższej definicji elementu klienta zdefiniowano przestrzeń nazw księgowości w celu rozróżnienia znaczników elementów od znaczników tworzonych w rekordach klienta przez inne aplikacje biznesowe:

<ksieg:klient xmlns:acct="http://www.my.com/acct-REV10">
	<ksieg:nazwa>Firma</ksieg:nazwa>
	<ksieg:zlecenie ksieg:ref="5566"/>
	<ksieg:status>faktura</ksieg:status>
</ksieg:klient>  

Definicja przestrzeni nazw w pierwszym wierszu przypisuje przestrzeń nazw http://www.my.com/acct-REV10 do przedrostka. Przedrostek z kolei zostaje użyty w nazwach elementów, np. nazwa, przyłączając je do przestrzeni nazw. Inna aplikacja, na przykład system realizacji, może przypisać inne przestrzenie nazw do elementów klienta:

<realiz:klient xmlns:realiz="http://www.your.com/ful">
	<realiz:nazwa>Firma</realiz:nazwa>
	<realiz:zlecenie realiz:ref="A98756"/>
	<realiz:status>dostarczony</realiz:status>
 </realiz:klient>  

Aplikacja przetwarzająca obie struktury danych będzie teraz mogła w różny sposób obsługiwać dane księgowe i z realizacji. Istnieje też domyślna przestrzeń nazw. Jest ona ustawiana, gdy w definicji przestrzeni nazw nie zostanie przypisana nazwa lokalna:

<ksieg:klient xmlns="http://www.my.com/acct-REV10" xmlns:ksieg="http://www.my.com/acct-REV10">
<nazwa>Firma</nazwa>
<zlecenie ksieg:ref="5566"/>
<status>faktura</status>
</klient>

W tym przykładzie wszystkie znaczniki w rekordzie klienta są zakwalifikowane jako znajdujące się w przestrzeni nazw http://www.my.com/acct-REV10. Nie jest potrzebny jawny przedrostek, ponieważ użyta jest domyślna przestrzeń nazw. Należy mieć na uwadze, że domyślna przestrzeń nazw dotyczy każdej definicji atrybutów.

Schematy XML i przestrzenie nazw

W poniższym schemacie XML domyślna przestrzeń nazw schematu jest zdefiniowana jako standardowa przestrzeń nazw schematu XML http://www.w3.org/2001/XMLSchema; istnieje także przestrzeń nazw dla konkretnego schematu 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="TypKoduPocztowego">
 <restriction base="integer">
  <minInclusive value="10000"/>
 <maxInclusive value="99999"/>
</restriction>
 </simpleType> 
 <!--pominięto definicje elementów-->
</schema> 

Zakładając, że poprzedni schemat XML zostanie zapisany jako C:\temp\TestSchema.xsd, przykładowy plik XML, który jest poprawny dla tego schematu, będzie następujący:

<?xml version="1.0"?>
<x:listaAdresow 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:adres>
 <x:ulica>x:Vangerowstrasse</x:ulica>
  <x:kodPocztowy>69115</x:kodPocztowy>
 <x:miasto>x:Heidelberg</x:miasto>
 </x:adres>
    <x:adres>
<x:ulica>x:Bernal Road</x:ulica>
<x:kodPocztowy>90375</x:kodPocztowy>
     <x:miasto>x:San Jose</x:miasto>
 </x:adres>
</x:listaAdresow> 

Docelowa przestrzeń nazw

Docelowa przestrzeń nazw służy do identyfikowania przestrzeni nazw, w której istnieje powiązanie między elementem a jego nazwą. W przypadku deklaracji powiązanie to określa przestrzeń nazw elementów w plikach XML zgodnych ze schematem. Plik XML importujący schemat musi odwoływać się do docelowej przestrzeni nazw w atrybucie schemaLocation. Wszelkie niezgodności między docelową a faktyczną przestrzenią nazw elementu są zgłaszane jako błędy sprawdzania poprawności schematu. W powyższym przykładzie docelową przestrzenią nazw jest http://www.ibm.com; jest ona zdefiniowana w pliku schematu XML i przywoływana w pliku XML dwukrotnie. Wszelkie niezgodności między tymi wystąpieniami przestrzeni nazw powodują wystąpienie błędów sprawdzania poprawności.

Poniższe przykłady pokazują, jak docelowe przestrzenie nazw i przedrostki przestrzeni nazw działają w schematach XML i odpowiadających im dokumentach instancji XML.

Przykład 1 - schemat z domyślną i docelową przestrzenią nazw oraz niekwalifikowanymi elementami lokalnymi

Schemat XML:

<?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="TypAdresu">
<sequence>
<element name="nazwa" type="string"></element>
</sequence>
</complexType>
<element name="MojAdres" type="x:TypAdresu"></element>
</schema> 

Poprawny dokument instancji XML utworzony z tego schematu wygląda następująco. Lokalne elementy i atrybuty są niekwalifikowane.

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

Kiedy elementy lokalne (na przykład element "nazwa") i atrybuty są niekwalifikowane w pliku XML, tylko element główny jest kwalifikowany. Dlatego w tym przykładzie przedrostek przestrzeni nazw "x" jest przypisywany do elementu głównego "MojAdres", wiążąc go z przestrzenią nazw "http://www.ibm.com", ale przedrostek "x" nie jest przypisywany do elementu lokalnego "nazwa".

Przykład 2 - schemat z domyślną i docelową przestrzenią nazw oraz kwalifikowanymi elementami lokalnymi

<?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="TypAdresu">
<sequence>
<element name="nazwa" type="string"></element>
</sequence>
</complexType>
<element name="MojAdres" type="x:TypAdresu"></element>
 </schema> 

Poprawny dokument instancji XML utworzony z tego schematu wygląda następująco. Lokalne elementy i atrybuty są kwalifikowane. Wynika to z tego, że atrybut elementFormDefault jest ustawiony w schemacie XML jako kwalifikowany.

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

W tym przykładzie przedrostek przestrzeni nazw "x" jest przypisany zarówno do elementu głównego "MojAdres", jak i lokalnego elementu "nazwa", co wiąże je z przestrzenią nazw "http://www.ibm.com".

Przykład 3 - schemat z docelową przestrzenią nazw i jawnie zdefiniowanym atrybutem xmlns:xsd

Ten schemat XML dodaje następujący atrybut:

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

Oznacza to, że każda konstrukcja zdefiniowana przez język schematu XML musi zostać zakwalifikowana za pomocą przedrostka "xsd". Na przykład: xsd:complexType i xsd:string

. Można także wybrać dowolne inne przedrostki, na przykład "xs" lub "costam" w deklaracji i składni.

Przedrostek ten można określić na stronie preferencji schematu XML. Więcej informacji na ten temat zawierają opisy czynności pokrewnych.

Wszystkie typy zdefiniowane przez użytkownika należą do przestrzeni nazw http://www.ibm.com zdefiniowanej w atrybucie targetNamespace, a przedrostkiem jest "x", który zdefiniowano w atrybucie 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="TypAdresu">
<xsd:sequence>
		 <xsd:element name="nazwa" type="xsd:string"></xsd:element>
</xsd:sequence>
 </xsd:complexType>
 <xsd:element name="MojAdres" type="x:TypAdresu"></xsd:element>
</xsd:schema>

Poprawny dokument instancji XML utworzony z tego schematu wygląda następująco. Lokalne elementy i atrybuty są niekwalifikowane. Semantyka kwalifikacji jest taka sama, jak w Przykładzie 1.

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

Przykład 4 - schemat z niezadeklarowaną docelową przestrzenią nazw, która jawnie definiuje xmlns:xsd

Dla tego schematu XML nie ma docelowej przestrzeni nazw. W takim przypiadku zdecydowanie zaleca się, aby wszystkie konstrukcje schematu XML były jawnie kwalifikowane przedrostkiem takim jak "xsd". Odwołania z tego schematu do definicji i deklaracji, takich jak TypAdresu, mają miejsce bez kwalifikacji przestrzeni nazw, ponieważ nie ma przedrostka przestrzeni nazw.

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

Poprawny dokument instancji XML utworzony z tego schematu wygląda następująco. Wszystkie elementy są niekwalifikowane.

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

Przykład 5 - schemat, w którym docelowa przestrzeń nazw jest przestrzenią domyślną

Jest to schemat XML, w którym docelowa przestrzeń nazw jest przestrzenią domyślną. Ponadto ta przestrzeń nazw nie ma przedrostka.

<?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="TypAdresu">
<xsd:sequence>
<xsd:element name="nazwa" type="xsd:string"></xsd:element>
</xsd:sequence>
</xsd:complexType>
 <xsd:element name="MojAdres" type="TypAdresu"></xsd:element>
 </xsd:schema> 

Poprawny dokument instancji XML utworzony z tego schematu wygląda następująco:

<?xml version="1.0" encoding="UTF-8"?>
<MojAdres xmlns="http://www.ibm.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com NewXMLSchema.xsd">
<nazwa>nazwa</nazwa>
 </MojAdres>
Zadania pokrewne
Edytowanie preferencji plików schematów XML