1. xml中的命名空間
1. 什麼是defaultNamespace?
就是xmlns屬性的值。defaultNamespace的作用就是它下面的沒有prefix的element的Namespace就是defaultNamespace. 示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--defaultNamespace為http://schema, a的namespace為http://schema1 -->
<a xmlns="http://schema1" xmlns:edi="http://ccc.cc">
<!--b由於沒有前綴,所以會自動採用defaultNamespace, 即http://schema1-->
<b edi:attr1="123" attr2="1.112">qwe</b>
<edi:a xmlns=http://xxx.xxx>
<!--d的namespace不再是http://schema1, 而是http://xxx.xxx, 因為d的父節點也定義了一個defaultNamespace: http://xxx.xxx-->
<d>false</d>
</edi:a>
<edi:a>
<!--注意,雖然e的父節點Namespace為http://ccc.ccc, 但是e的namespace並不是http://ccc.cc, 而是http://schema1-->
<e>false</e>
</edi:a>
</a>
2.如果一個element定義了xmlns="xxx"屬性, 那麼直接具有xxx的Namespace, 除非這個element自己包含一個前綴。
...
<!-- a 具有xxx 命名空間 -->
<!-- 屬性d不具有xxx命名空間 -->
<a xmlns="xxx" d="ddd">
<!--b也具有xxx命名空間 -->
<b>
...
</b>
<!--c不具有xxx的命名空間-->
<edi:c>
...
<edi:c>
</a>
...
<!--a不具有xxx命名空間, 因為它使用著edi的命名空間-->
...
<edi:a xmlns="xxx">
<b>
...
</b>
</edi:a>
...
5.3 Uniqueness of Attributes
In XML documents conforming to this specification, no tag may contain two attributes which:
have identical names, or
have qualified names with the same local part and with prefixes which have been bound to namespace names that are identical.
For example, each of the bad start-tags is illegal in the following:
<!-- http://www.w3.org is bound to n1 and n2 -->
<!--沒有prefix的attribute不具有任何命名空間-->
<x xmlns:n1="http://www.w3.org"
xmlns:n2="http://www.w3.org" >
<bad a="1" a="2" />
<!--n1:a和n2:a的命名空間和屬性名均相同,不允許出現在同一個element中-->
<bad n1:a="1" n2:a="2" />
</x>
However, each of the following is legal, the second because the default namespace does not apply to attribute names:
<!-- http://www.w3.org is bound to n1 and is the default -->
<x xmlns:n1="http://www.w3.org"
xmlns="http://www.w3.org" >
<good a="1" b="2" />
<!--屬性a的命名空間為空,而n1:a的命名空間為http://www.w3.org-->
<good a="1" n1:a="2" />
</x>
targetNamespace
在Schema中targetNamespace定義了Schema定義出的新元素與屬性的名稱空間。也就是它是對所定義的XML模型進行限制:限制定義出的元素,或者屬性的名稱空間。與targetNamespace相關的還有兩個屬性:elementFormDefault ,attributeFormDefault,這兩個屬性的預設值都是unqualified。 如果定義為unqualified表示定義的元素的名稱空間可以預設,此時直接引用父元素的名稱空間。如果是qualified則表示,必需要指明名稱空間,不能直接引用其父元素的,要指明。(如果Schema限定的文檔,剛好定義了」空的名稱空間「並且剛好與targetNamespace一至,可以預設)。
在WSDL中也有一個targetNamespace,但是沒有Schema中的兩個屬性。但其它這兩個屬性在WSDL中其實並不需要,不管這兩個屬性取值,對文檔其實沒有什麼影響,所以也就不用定義這兩個屬性。
不失一般性,下面我假定WSDL與SOAP綁定。WSDL是用來定義的是服務的一些屬性,targetNamespace定義的服務「收到的請求」與「發出響應」的一些屬性(也許有其它的,但我沒發現,如果有知道的,請指教),定義了請求與響應對應的XML元素應該使用的名稱空間。從SOAP協議中,我們可以看到,響應與請求元素的父元素是<env:Body>,它的名稱空間是SOAP標准指定了的,根據不同的SOPA協議版本不同,比如Soap1.1為http://schemas.xmlsoap.org/soap/envelope/ ,而Soap1.2為http://www.w3.org/2001/06/soap-envelope。
這樣導致了響應與請求元素也就無法使用其父元素的名稱空間,要使響應與請求的名稱空間與targetNamespace一至,元素也就不能使用預設的父元素的名稱空間,必需顯示的使用完整的名稱空間。這樣在Schema中出現的elementFormDefault ,attributeFormDefault兩個屬性,也就在WSDL中沒有存在的必要了。
也就是WSDL與Schema中的targetNamespace基本上是一至,你完全可以相互參考起來理解。
參考文獻:
http://xml.org.cn/dispbbs.asp?BoardID=23&id=25672&replyID=17053&star=1&skin=0
http://www.w3.org/TR/xmlschema-0/#UnqualLocals (Schema的官方文檔)
http://www.w3.org/TR/wsdl#_Toc492291093 (WSDL的官方文檔)
schemaLocation是用來指定XML Schema文檔路徑的
新的 XML Schema 系統即將成為 W3C 推薦標准,目的是為了克服 DTD 的局限性(請參閱側欄, DTD 的局限性 ),為 XML 文檔提供豐富的語法結構。本文展示了模式的靈活性,說明如何使用 XML Schema 系統來定義最基本的 XML 文檔構造塊——元素。
XML Schema 比 DTD 更強大。為了說明 XML Schema 機制的強大功能,下面三個程序清單簡要比較了表示元素的不同方式。 清單 1給出了一個 XML 文檔片段, 清單 2用 DTD 語法聲明了這兩個元素, 清單 3則是相應的 XML Schema 語法形式。要注意, 清單 3中所用的是相同的 XML 語法。通過模式,驗證解析器可以檢查元素 InvoiceNo 是否是正整數,元素 ProctID 的首字元是否為 A 到 Z 之間的字母,後面為六個阿拉伯數字。相反,引用 DTD 的驗證解析器只能檢查這些元素是否用字元串表示。
2. xml的「命名空間」有什麼用
您好,很高興為您解答。
XML文檔可以創建自定義的元素和屬性詞彙來描述數據。當XML文檔較為復雜或是需要從別的地方取得內容時,一個文檔中有可能會需要不止一個詞彙,這樣就會產生名稱相同而含義不同的元素出現在不同詞彙中的情況。
例如,如果需要建立一個含有XHTML信息的傢具目錄:
在這個XML文檔中,同樣名為<table>的兩個元素卻有著完全不同的含義。
命名空間可以指明哪個元素屬於哪個詞彙。它可以為每個詞彙指定唯一的前綴進行識別,再將該前綴應用於XML文檔中的元素上:
雖然有一些慣例可以遵循,但這里選擇的前綴並不理想。在上個例子中,第一個前綴cat表示的是目錄項。你同樣可以將之稱為dog或catalog。第二個前綴xhtml表示的是文檔中的XHTML元素。這是一個符合命名空間慣例的例子。
命名空間使用統一資源定位符(URI)來識別每個詞彙。在上麵包含XHTML內容的例子中,URI是由W3C控制的,因為它控制著XHTML標准。你也可以將cat前綴置於自己的控制之下。
值得注意的是,URI並不一定需要指向一個實際的文檔或目錄。對它僅有的要求就是,在XML文檔中它必須是唯一的。然而很多處理程序,包括XML模式、XHTML和XSLT處理程序,都使用URI來註明它們必須處理文檔的某一部分。因此,對於這些應用程序需要使用正確的URI。
在http://www.w3.org/TR/REC-xml-names/中可以找到W3C關於「XML中的命名空間(Namespaces in XML)」的推薦標准。
2.1.1 在XML文檔中加入命名空間
為了引用一個命名空間,可以將其以屬性的形式加入任何包含了屬於該命名空間中元素的節點中。命名空間經常加在文檔元素中,因為它包含了所有其他的元素。在上面的XML文檔中,最開始的元素可改寫為如下形式:
這決定了命名空間cat指向URI http://www.apress.com/ns/furniture。命名空間cat可置於任何元素名字前,並以冒號分開:
2.1.2 添加默認命名空間
一個XML文檔的大部分通常都屬於一個XML詞彙。在這種情況下,可以定義一個默認的命名空間,而不是為每個元素重復地添加命名空間前綴。可以使用xmlns關鍵字來定義默認的命名空間。這樣,就不用為默認命名空間內的元素指定前綴了。
例如,可以將catalog指定為默認命名空間:
現在這是默認的命名空間了,因而就不必再在此命名空間內的元素名前加上前綴了。
可以在文檔中的任何位置聲明默認命名空間。被聲明的默認命名空間適用於包含了聲明的元素及其所有子元素,而且會覆蓋此前所做的聲明。
下面的XML文檔演示了如何使用多個默認命名空間:
默認的catalog命名空間適用於除了包含於第二個<table>元素內的所有元素。因為加入了命名空間聲明,下面元素默認的就是XHTML命名空間:
關於命名空間的最後一點是關於它們使用的屬性。默認情況下,屬性與它包含的元素屬於同一個命名空間中。除非你使用的是不同於其包含元素的其他命名空間中定義的屬性,否則就不必進行驗證。
在關於如何使用DTD和XML模式定義XML詞彙的內容中,將會進一步說明命名空間的重要性。