內如來源:https://i.cnblogs.com/posts/edit-done;postId=16056381
https://www.w3.org/TR/REC-xml-names/#sec-namespaces
中文反應版本:namespance 命名空間
動機和總結
我們設想了可擴展標記語言(XML)的應用程序,其中單個XML文檔可能包含為多個軟件模塊定義和使用的元素和屬性(此處稱為"標記詞匯表")。這樣做的一個動機是模塊化:如果存在這樣一個很好理解的標記詞匯表,並且有可用的有用軟件,那么最好重用這個標記,而不是重新發明它。
此類文檔包含多個標記詞匯表,會帶來識別和沖突問題。軟件模塊需要能夠識別它們設計要處理的元素和屬性,即使當用於其他軟件包的標記使用相同的元素名稱或屬性名稱時,也會發生"沖突"。
這些注意事項要求文檔構造應構造名稱,以避免來自不同標記詞匯表的名稱之間發生沖突。此規范描述了一種機制,即 XML 命名空間,該機制通過將擴展名稱分配給元素和屬性來實現此目的。
XML 名稱空間
XML 命名空間提供了一種簡單的方法來限定可擴展標記語言文檔中使用的元素和屬性名稱,方法是將它們與 URI 引用標識的命名空間相關聯。關聯的文件就是XML Schema,有關xml框架語言請點擊閱讀
XML Namespaces提供了一種xml文檔中避免元素名稱沖突的方法
XML 名稱空間是一組用 IRI/URI 引用標識的名稱,這些名稱在 XML 文檔中用作元素類型和屬性名稱。
命名空間隱射的語法如下:
xmlns 屬性用於映射命名空間
xmlns:prefix=namespace //擴展名稱,擴展名稱是一對key:valuexmlns=namespace //默認命名空間xmlns 用來指定元素和屬性來自那個命名空間。
版本
Namespaces in XML 1.1(<?xml version="1.1" encoding="US-ASCII"?>)
1、容許取消綁定已經綁定的前綴,默認命名空間可以取消
2、命名空間使用IRI格式命名(URL, URN, URI, IRI 的區別)
與Namespaces in XML 1.0(<?xml version="1.0" encoding="US-ASCII"?>)
1、 不容許取消綁定已經綁定的前綴,默認命名空間可以取消
2、命名空間使用URI格式命名(URL, URN, URI, IRI 的區別)
基本概念
以下是《Namespaces in XML1.0》規范中的部分內如:
1、命名空間聲明有3種:默認Namespaces(只能有一個)和有名稱Namespaces、無名稱Namespaces
<x xmlns ="http://www.w3.org" //默認命名空間 該命名空間下是屬性和元素不用加前綴 xmlns:n2="http://www.w3.org/prefix" > //擴展命名空間 n2 使用該命名空間下是屬性和元素要加前綴 </x>
2、聲明命名空間 可應用與屬性和元素,{默認命名空間} 不直接應用於屬性。
//作用與屬性 <x xmlns:edi='http://ecommerce.example.org/schema'> <!-- the 'taxClass' attribute's namespace is http://ecommerce.example.org/schema --> <lineItem edi:taxClass="exempt">Baby food</lineItem> </x> //作用與元素 <edi:price xmlns:edi='http://ecommerce.example.org/schema' units='Euro'>32.18</edi:price>
3、命名空間可以被覆蓋
聲明一個 {默認命名空間} 意味着,若是 {默認命名空間} 聲明范圍內的任何元素未使用前綴顯式限定,則該元素將被隱式限定。與帶前綴的命名空間同樣,{默認命名空間} 也能夠被覆蓋。{默認命名空間} 聲明以下:
<?xml version="1.0"?> <Book xmlns="http://www.library.com"> <Title>Sherlock Holmes</Title> <someElement xmlns:dd="http://www.foo.com"/>Arthur Conan Doyle</someElement> //覆蓋默認的命名空間 </Book>
4、命名空間約束:以三字母序列 x、m 和 l(采用任何大小寫組合)開頭的前綴被保留
xmlns屬性就是在命名空間中定義的。用於將命名空間URI/IRI 映射為簡短的本地常量,方便文檔中使用 命名空間。
5、XML Namespaces in XML1.0指定了使用URI格式的名稱作為xml框架文檔的名稱(框架的標識符(身份證)),XML Namespaces in XML1.1推薦用IRI 作命名空間名稱。
6、XML解析器處理命名空間IRI/URI時也僅僅將其作為字符串,URI不是真是存在的,僅僅用來標識xml文檔。
7、空字符串雖然是合法的 URI 引用,但不能用作命名空間名稱。
不推薦在命名空間聲明中使用相對 URI 引用(包括同一文檔引用)
8、可以將多個命名空間前綴聲明為單個元素的屬性
<?xml version="1.0"?> <!-- both namespace prefixes are available throughout --> <bk:book xmlns:bk='urn:loc.gov:books' xmlns:isbn='urn:ISBN:0-395-36341-6'> <bk:title>Cheaper by the Dozen</bk:title> <isbn:number>1568491379</isbn:number> </bk:book>
9、能取消默認命名空間綁定,默認命名空間聲明中的屬性值可能為空。在聲明的范圍內,這具有相同的效果,即沒有默認命名空間。
<?xml version='1.0'?> <Beers> <!-- the default namespace inside tables is that of HTML --> <table xmlns='http://www.w3.org/1999/xhtml'>//不為空 <th><td>Name</td><td>Origin</td><td>Description</td></th> <tr> <!-- no default namespace inside table cells --> <td><brandName xmlns="">Huntsman</brandName></td> <td><origin xmlns="">Bath, UK</origin></td> <td> <details xmlns=""><class>Bitter</class><hop>Fuggles</hop>//為空,等於沒有綁定命名空間 <pro>Wonderful hop, light alcohol, good summer beer</pro> <con>Fragile; excessive variance pub to pub</con> </details> </td> </tr> </table>
10、屬性的唯一性
在符合此規范的 XML 文檔中,任何標記都不能包含兩個屬性:
(1)、具有相同的名稱或
(2)、具有具有相同本地部分的限定名稱,並且前綴已綁定到相同的命名空間名稱。
<!-- http://www.w3.org is bound to n1 and n2 --> <x xmlns:n1="http://www.w3.org" xmlns:n2="http://www.w3.org" > <bad a="1" a="2" /> <bad n1:a="1" n2:a="2" /> </x>
11、默認的命名空間
默認命名空間聲明應用於作用域內所有不帶前綴的元素名,默認命名空間不直接作用於屬性名,不帶前綴的屬性名的解析將由它們出現所在的元素決定。
12、在實例中引用架構文檔
XML Schema提供了兩個在實例文檔中使用的特殊屬性,用於指出模式文檔的位置。這兩個屬性是:xsi:schemaLocation和xsi:noNamespaceSchemaLocation,前者用於聲明了目標名稱空間的模式文檔,后者用於沒有目標名稱空間的模式文檔,它們通常在實例文檔中使用。
xsi:schemaLocation屬性
xsi:schemaLocation屬性的值由一個URI引用對組成,兩個URI之間以空白符分隔。第一個URI是名稱空間的名字,第二個URI給出架構文檔的位置,架構處理器將從這個位置讀取模式文檔,該架構文檔的目標名稱空間必須與第一個URI相匹配。我們看例4-28。
例4-28 book6.xml
<?xml version="1.0" encoding="GB2312"?> <book xmlns=" http://www.sunxin.org/book" ① xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" ② xsi:schemaLocation=" http://www.sunxin.org/book http://www.sunxin.org/ book.xsd"> ③ <title>《Struts 2深入詳解》</title> <author>孫鑫</author> </book>
① 聲明默認的名稱空間( http://www.sunxin.org/book)。
② 聲明XML Schema實例名稱空間( http://www.w3.org/2001/XMLSchema-instance),並將xsi前綴與該名稱空間綁定,這樣架構處理器就可以識別xsi:schemaLocation屬性。XML Schema實例名稱空間的前綴通常使用xsi。
③ 使用xsi:schemaLocation屬性指定名稱空間 http://www.sunxin.org/book和模式位置 http://www.sunxin.org/book.xsd相關。要注意,在這個例子中,book.xsd中聲明的目標名稱空間要求是 http://www.sunxin.org/book。
13、同一個命名空間既可以用於實際工作,也可以在根據外部組件定義模式組件的過程中使用:
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:html="http://www.w3.org/1999/xhtml" targetNamespace="uri:mywork" xmlns:my="uri:mywork"> <import namespace="http://www.w3.org/1999/xhtml"/> <annotation> <documentation> <html:p>[Some documentation for my schema]</html:p> </documentation> </annotation>
內容來源:https://www.w3.org/TR/xmlschema-1/#xsi.noNamespaceSchemaLocation
14、schemaLocation 綁定xsd多個架構
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/1999/XSL/Transform http://www.w3.org/1999/XSL/Transform.xsd http://www.w3.org/1999/xhtml http://www.w3.org/1999/xhtml.xsd">
1、sdx文件前綴通常用xsi
2、xsi:schemaLocation屬性的值可以由多個URI引用對組成
3、解析器在解析xsi:schemaLocation時會忽略xsi ,只解析schemaLocation后面 的鍵值對,根據命名空間 找到相應的具體xsd文件。
4、此外,要注意的是,XML Schema推薦標准並沒有要求模式處理器必須要使用xsi:schemaLocation屬性,某些模式處理器可以通過其他的方式來得到模式文檔的位置,而忽略xsi:schemaLocation屬性。
內容來源:https://www.w3.org/TR/xmlschema-1/#xsi_schemaLocation
15、 不綁定命名空間xsi:noNamespaceSchemaLocation屬性
<?xml version="1.0" encoding="GB2312"?> <book xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="book.xsd" isbn="978-7-121-06812-6" > <title>《Struts 2深入詳解》</title> <author>孫鑫</author> </book>
1、xsi:noNamespaceSchemaLocation屬性用於引用沒有目標名稱空間的模式文檔。與xsi:schemaLocation屬性不同的是,xsi:noNamespaceSchemaLocation屬性的值是單一的值,只是用於指定架構文檔的位置。例4-31顯示了在實例文檔中xsi:noNamespaceSchema Location屬性的使用。
2、此外,要注意的是,XML Schema推薦標准並沒有要求架構處理器必須要使用xsi:noNamespaceSchemaLocation屬性,某些架構處理器可以通過其他的方式來得到架構文檔的位置,而忽略xsi:noNamespaceSchemaLocation屬性。
取消聲明命名空間
Namespaces in XML 1.0 W3C 推薦標准不容許取消綁定已經綁定的前綴,而 Namespaces in XML 1.1 W3C 推薦標准則容許這樣作。1.0 沒有理由不容許取消綁定,不過該錯誤已經在 1.1 中獲得修正。沒必要知道此差異,這是由於支持 Namespaces in XML 1.1 的 XML 分析器並很少。
盡管取消綁定帶前綴的命名空間有一些差異,但這兩個版本均容許您取消綁定或刪除已聲明的 {默認命名空間}:用其余 {默認命名空間} 聲明(覆蓋聲明中的命名空間為空)覆蓋已聲明的 {默認命名空間}。取消綁定命名空間與未聲明命名空間具備一樣的效果。此處的 Sherlock Holmes - III 和 Sherlock Holmes - I 的元素 Book、Title 和 Author 與命名空間 http://www.library.com 關聯,而Sherlock Holmes - II 的元素 purchase、 Title 和 Author {沒有命名空間}:
<someElement xmlns="" />
<?xml version="1.0"?> <Book xmlns="http://www.library.com"> <Title>Sherlock Holmes - I</Title> <Author>Arthur Conan Doyle</Author> <purchase xmlns=""> <Title>Sherlock Holmes - II</Title> <Author>Arthur Conan Doyle</Author> </purchase> <Title>Sherlock Holmes - III</Title> <Author>Arthur Conan Doyle</Author> </Book>
此處是根據 XML 1.0 規范中的命名空間取消綁定前綴的無效示例,而根據 XML 1.1 中的命名空間取消綁定前綴則是有效的:
<purchase xmlns:lib="">
今后處開始,前綴 lib 不能在 XML 文檔中使用,由於只要您在元素 purchase 的范圍內,它就保持未聲名狀態。固然,您徹底能夠再次定義它。
XML處理器
可以讀取和處理XML文檔的任何程序被稱為XML處理器。
XML處理器被划分為驗證或無驗證類型,這取決於他們是否檢查XML文檔的有效性。在發現一個有效性的錯誤處理器必須能夠匯報,但可繼續進行正常的處理.
一些驗證解析器 : xml4c (IBM, in C++), xml4j (IBM, in Java), MSXML (Microsoft, in Java), TclXML (TCL), xmlproc (Python), XML::Parser (Perl), Java Project X (Sun, in Java).
一些非驗證解析器 : OpenXML (Java), Lark (Java), xp (Java), AElfred (Java), expat (C), XParse (JavaScript), xmllib
命名空間和 XML 模式(也叫XML架構)
內如來源:http://www.noobyard.com/article/p-ciylhgkx-dd.html
到目前為止,咱們已經了解了如何聲明和使用現有命名空間。如今,讓咱們了解如何建立一個新命名空間,並使用 XML 模式將元素和屬性添加到其中。
XML 模式首先是一個 XML。換言之,同任何其余 XML 文檔同樣,XML 模式使用元素和屬性構建。此“構建材料”必須出自命名空間http://www.w3.org/2001/XMLSchema,它是已聲明和保留的命名空間,其中包含 W3C XML 模式結構規范 和 W3C XML 模式數據類型規范 中定義的元素和屬性。不該將元素或屬性添加到該命名空間。
使用這些構建塊,能夠根據須要建立新元素和屬性,並對這些元素和屬性附加所需的約束,並將其保留在某個命名空間中。(請參見 圖 1。)XML 模式將此特殊命名空間稱做 {目標命名空間},即新建的元素和屬性將駐留到的命名空間。
圖 1:XML 模式命名空間中的元素和屬性用於編寫 XML 模式文檔,
該文檔生成由用戶定義的元素和屬性並將其置於 {目標命名空間} 中。
此 {目標命名空間} 隨后用於驗證 XML 實例。
此 {目標命名空間} 從 XML 實例中引用,以確保實例文檔的有效性。(請參見 圖 2 。)在驗證過程當中,驗證器驗證明例中所用的元素/屬性是否存在於已聲明的命名空間中,並檢查是否對其結構和數據類型存在其余約束。
圖 2:從 XML 模式到 XML 模式實例
http://www.w3.org/2001/XMLSchema-instance 命名空間 提供了兩個在實例文檔中使用的特殊屬性,用於指出模式文檔的位置。這兩個屬性是:xsi:schemaLocation和xsi:noNamespaceSchemaLocation,前者用於聲明了目標名稱空間的框架文檔,后者用於沒有目標名稱空間的框架文檔,它們通常在實例文檔中使用。
限定或未限定
在 XML 模式中,咱們能夠選擇指定實例文檔是必須限定全部元素和屬性,仍是只限定全局聲明的元素和屬性。不管作出什么樣的選擇,都將驗證整個實例。那么,咱們為何有兩個選擇呢?
答案是“可管理性”。當咱們選擇 限定 時,咱們指定實例中的全部元素和屬性都必須有一個命名空間,這將加強實例的命名空間復雜性。好比,當因將某些局部聲明變為全局聲明和/將某些全局聲明變為局部聲明而修改了模式時,根本不會影響實例文檔。相反,若是選擇 非限定,則指定只有實例中全局聲明的元素和屬性才必須具備命名空間,從而隱藏實例的命名空間復雜性。但在此情形下,好比,當因將某些局部聲明變為全局聲明和/將某些全局聲明變為局部聲明而修改了模式時,將影響全部實例文檔 且實例再也不有效。若是試圖根據已修改的 XML 模式驗證該實例,則 XML 模式驗證器將報告驗證錯誤。所以,必須根據 XML 模式中所做的修改修正命名空間,才能從新使該實例有效。
<?xml version="1.0" encoding="US-ASCII"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.library.com" targetNamespace="http://www.library.com" elementFormDefault="qualified"> attributeFormDefault="unqualified"> <element name="Book" type="tns:BookType" /> <complexType name="BookType"> <sequence> <element name="Title" type="string" /> <element name="Author" type="string" /> </sequence> </complexType> </schema>
元素 <schema> 的最近子元素為全局聲明,而其余元素則為局部聲明。在以上示例中, Book 和 BookType 被全局聲明,而 Title 和Author 則被局部聲明。
能夠經過將模式元素屬性 elementFormDefault 和 attributeFormDefault 設置為 qualified 或 unqualified 表示在限定和非限定之間的選擇。
elementFormDefault = (qualified | unqualified) :unqualified
attributeFormDefault = (qualified | unqualified) :unqualified
當將 elementFormDefault 設置為 qualified 時,它表示在該語法的實例中,必須使用前綴或經過設置 {默認命名空間} 來顯式限定全部元素。 unqualified 設置意味着只有全局聲明的元素才 必須 被顯式限定,而局部聲明的元素 不得 被限定。在此情形下,限定一個局部聲明是錯誤的。一樣,將 attributeFormDefault 設置為 qualified 時, 必須使用前綴顯式限定實例文檔中的全部屬性。
注意,{默認命名空間} 不該用於屬性;所以,不能使用 {默認命名空間} 聲明限定屬性。 Unqualified 好像暗示經過包含的元素位於命名空間中。這頗有趣,對吧?
在下圖中,概念符號空間相似於命名空間分區的非規范性概念。例如,若是將命名空間比做電冰箱,那么符號空間就是冰箱中的架子。就像架子對電冰箱中的整個空間進行分區同樣,符號空間對命名空間進行分區。
命名空間中有三個主要分區:一個用於全局元素聲明,一個用於全局屬性聲明,一個用於全局類型聲明 (complexType/simpleType)。這種安排表示,全局元素、全局屬性和全局類型能夠具備相同的名稱,並能夠在 {目標命名空間} 中共存而不發生任何名稱沖突。此外,每一個全局元素和全局 complexType 擁有其本身的符號空間來包含局部聲明。
讓咱們來看看屬性對 elementFormDefault 和 attributeFormDefault 的四種可能的值組合。
情形 1: elementFormDefault=qualified, attributeFormDefault=qualified
此處,{目標命名空間} 直接包含全部元素和屬性;所以在該情形中,必須限定全部元素和屬性。
情形 2: elementFormDefault=qualified, attributeFormDefault=unqualified
此處,{目標命名空間} 直接包含全部元素,且這些元素的相應屬性包含在相應元素的符號空間中。所以,在該情形中,只須限定元素,而不得限定屬性,除非屬性是全局聲明的。
情形 3: elementFormDefault=unqualified, attributeFormDefault=qualified
此處,{目標命名空間} 直接包含全部屬性和僅全局聲明的元素,同時這些元素在其符號空間中包含其子元素。所以,在該情形中,只虛限定全局聲明的元素和全部屬性。
情形 4: elementFormDefault=unqualified, attributeFormDefault=unqualified
此處,{目標命名空間} 直接包含僅在全局聲明的元素,同時這些元素在其符號空間中包含其子元素。每一個元素在其符號空間中包含相應的屬性;所以,在該情形中,只需限定僅在全局聲明的元素和屬性。
以上各圖用於直觀說明命名空間內直接包含的內容或傳遞式包含的內容(取決於elementFormDefault/ attributeFormDefault 的值)。該設置表示直接位於{目標命名空間} 中的元素/屬性必須在相應的 XML 實例中擁有一個與其關聯的命名空間,而未直接(傳遞式)位於 {目標命名空間} 中的元素/屬性不得在相應的 XML 實例中擁有一個與其關聯的命名空間。
目標命名空間和無目標命名空間
如今,咱們知道 XML 模式建立新元素和屬性並將其置於稱做 {目標命名空間} 的命名空間中。但若是在該模式中未指定 {目標命名空間} 又會怎么樣?若是未指定屬性targetNamespace,則將不存在 {目標命名空間} 這是合法的 但在targetNamespace 屬性中指定一個空 URI 則是“非法”的。
例如,如下代碼無效。不能為 {目標命名空間} 指定一個空 URI:
<schema targetNamespace="" . . .>
在此情形中,若是不存在 {目標命名空間},則如前所述,則將新建的元素和屬性保存在 {無命名空間} 中。(使用術語 {默認命名空間} 是錯誤的。)要驗證相應的 XML 實例,相應的 XML 實例必須使用 http://www.w3.org/2001/XMLSchema-instance 命名空間中的 noNamespaceSchemaLocation 屬性來引用沒有目標命名空間的 XML 模式。
結論
衷心但願此命名空間概述可以幫助您更輕松地遷移到 XML 模式。Oracle XML 開發人員工具包 (XDK) Namespaces in the XML 1.0 W3C 推薦標准中的 W3C 命名空間;您能夠經過使用 SAXParserFactory 和 DocumentBuilderFactory 類中的setNamespaceAware(boolean) 方法打開/關閉命名空間檢查(使用 Oracle XDK 中的 JAXP API)。
XPath查詢與xmlns屬性
命名空間和 XML 框架(xml schemas)
到目前為止,咱們已經了解了如何聲明和使用現有命名空間。如今,讓咱們了解如何建立一個新命名空間,並使用 XML 模式將元素和屬性添加到其中。
XML 模式首先是一個 XML。換言之,同任何其余 XML 文檔同樣,XML 框架使用元素和屬性構建。此“構建材料”必須出自命名空間http://www.w3.org/2001/XMLSchema,它是已聲明和保留的命名空間,其中包含 W3C XML 框架結構規范 和 W3C XML 框架數據類型規范 中定義的元素和屬性。不該將元素或屬性添加到該命名空間。