XML 名稱空間

XML 名稱空間是名稱的集合,其是由 URI 參照所識別,並用於 XML 文件中作為元素類型和屬性名稱。

XML 名稱空間是 1999 年 1 月 14 日由提出的一份 W3C 提案所定義, 稱為 Namespaces in XML。 XML 標示名稱應該是全球獨一無二,且基於效能考量,也應該儘量簡短。 為了解決這兩相牴觸的矛盾,W3C 名稱空間提案定義 xmlns 屬性來修正任何 XML 元素。 如果它存在於元素中,則會識別這個元素的名稱空間。

xmlns 屬性的語法如下:

xmlns:prefix=namespace

其中,namespace 是唯一的 URI(例如 www.ibm.com), prefix 代表名稱空間且提供指標。

在下列客戶元素定義中,定義帳戶名稱空間以區別元素標示和其他商業應用程式所建立的客戶記錄中出現的標示:

<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)利用這個字首來附加至名稱空間。 第二個應用程式(例如,訂單出貨系統)可以指派不同的名稱空間給客戶元素:

<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 綱目定義中, 綱目的預設名稱空間定義為標準的 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> 
 <!--略過元素定義 -->
</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 實例文件中的使用方式。

範例 1 - 綱目同時具有預設和目標名稱空間,以及未限定的區域項目

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 實例文件就像這樣。 區域元素和屬性未限定

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

範例 2 - 綱目同時具有預設和目標名稱空間,以及限定的區域項目

<?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 實例文件就像這樣。 區域元素和屬性已限定。這是因為 XML 綱目中的 elementFormDefault 屬性設為 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" 建立關聯性。

範例 3 - 綱目有目標名稱空間,且明確定義 xmlns:xsd

這個 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 實例文件就像這樣。 區域元素和屬性未限定。資格的語意同於範例 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>

範例 4 - 綱目未宣告明確定義 xmlns:xsd 的目標名稱空間

這個 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 實例文件就像這樣。 所有元素皆未限定

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

範例 5 - 綱目以預設名稱空間為目標名稱空間

這是以預設名稱空間為目標名稱空間的 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>  
相關工作
編輯 XML 綱目檔喜好設定