XML 名稱空間是名稱的集合,這些名稱是由 URI 參照所識別,且會用於 XML 文件中作為元素類型和屬性名稱。
xmlns 屬性具有下列語法:
xmlns:prefix=namespace
其中 namespace 是專屬的 URI(例如 www.ibm.com) ,其中 prefix 代表名稱空間並提供它的指標。
在下列 customer 元素定義中,定義了帳戶名稱空間以區分元素標示與那些由其他商業應用系統所建立並出現在客戶記錄中的標示:
<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>
第一行的名稱空間定義將 http://www.my.com/acct-REV10 這個名稱空間指派給字首。這個字首使用於元素名稱中(例如 name)以 便將它們連結到名稱空間。 第二個應用程式如履行系統,可指定不同的名稱空間給它的 customer 元素:
<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>
同時處理兩種資料結構的應用程式現在能夠以不同方式處理帳戶資料和履行資料。 有預設的名稱空間。 如果在名稱空間定義中未指定區域名稱,則會設定它。
<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>
在這個範例中,客戶記錄的所有標示已定義為在 http://www.my.com/acct-REV10 這個名稱空間中。不需要明確字首,因為已使用預設的名稱空間。 注意,預設的名稱空間套用至任何屬性定義。
在下列 XML 綱目中,綱目之預設名稱空間是定義成標準 XML 綱目名稱空間 http://www.w3.org/2001/XMLSchema;另外還有一個綱目專用的名稱空間 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>
假設上述 XML 綱目儲存成 C:\temp\TestSchema.xsd,則驗證這個綱目的範例 XML 檔如下:
<?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>
目標名稱空間可用來識別構成元素與其名稱之間的關聯性之名稱空間。以宣告為例,這個關聯決定了 XML 檔中符合這個綱目之元素名稱空間。 匯入綱目之 XML 檔必須參照它在 schemaLocation 屬性中的目標名稱空間。 如果元素的目標和實際名稱空間不符,將當成綱目驗證錯誤來報告。 在我們的範例中,目標名稱空間是 http://www.ibm.com;它定義在 XML 綱目檔中,且在 XML 檔中參照它兩次。 如果所出現的三個名稱空間有任何不符,就會造成驗證錯誤。
以下範例顯示目標名稱空間和名稱空間字首如何在 XML 綱目及其對應的 XML 實例文件中運作。
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="AddressType"> <sequence> <element name="name" type="string"></element> </sequence> </complexType> <element name="MyAddress" type="x:AddressType"></element> </schema>
從這個綱目建立的有效 XML 實例文件外觀如下。區域元素和屬性為是 unqualified。
<?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>
如果區域元素(例如 "name" 元素)和屬性在 XML 檔中均未定義,則只定義根元素。因此,在本範例中,"x" 名稱空間字首是指定給根元素 "MyAddress",使它與名稱空間 "http://www.ibm.com" 產生關聯,但 "x" 字首未指定給區域元素 "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>
從這個綱目建立的有效 XML 實例文件外觀如下。區域元素和屬性是 qualified - 這是因為 elementFormDefault 屬性在 XML 綱目中是設定成「已定義」(qualified)。
<?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>
在本範例中,"x" 名稱空間字首是指定給根元素 "MyAddress" 和區域元素 "name",使它們與名稱空間 "http://www.ibm.com" 產生關聯。
這個 XML 綱目會新增這個屬性:
xmlns:xsd="http://www.w3.org/2001/XMLSchema這表示 XML 綱目語言所定義的每一個建構需要以 "xsd" 字首定義。例如:xsd:complexType 和 xsd:string。
請注意,您可以在宣告和用法上選擇任何其他字首,如 "xs" 或 "foobar"。
您可以在「XML 綱目喜好設定」頁面中指定這個字首。如果需要詳細資訊,請參閱相關作業。
所有使用者定義的類型都屬於 targetNamespace 屬性所定義的 http://www.ibm.com 名稱空間,字首是 xmlns:x 屬性所定義的 "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>
從這個綱目建立的有效 XML 實例文件外觀如下。區域元素和屬性為是 unqualified。資格的語意與範例 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>
這個 XML 綱目本身沒有目標名稱空間。在這個情況下,強力建議您以 "xsd" 之類的字首來明確定義所有 XML 綱目建構。這個綱目中的 AddressType 之類定義和宣告的參照沒有名稱空間限定,因為沒有名稱空間字首。
<?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>
從這個綱目建立的有效 XML 實例文件外觀如下。所有元素都是 unqualified。
<?xml version="1.0"?> <MyAddress xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="x.xsd"> <name>name</name> </MyAddress>
這是目標名稱空間為預設名稱空間的 XML 綱目。另外,這個名稱空間沒有名稱空間字首。
<?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>
從這個綱目建立的有效 XML 實例文件外觀如下:
<?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>