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.
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.
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 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.
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".
<?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".
Ten schemat XML dodaje następujący atrybut:
xmlns:xsd="http://www.w3.org/2001/XMLSchemaOznacza 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>
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>
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>