官术网_书友最值得收藏!

3.5 使用命名空間

Java語言使用包來避免名字沖突。程序員可以為不同的類使用相同的名字,只要它們不在同一個包中即可。XML也有類似的命名空間(namespace)機制,可以用于元素名和屬性名。

名字空間是由統一資源標識符(Uniform Resource Identifier,URI)來標識的,比如:

HTTP的URL格式是最常見的標識符。注意,URL只用作標識符字符串,而不是一個文件的定位符。例如,名字空間標識符:

表示了不同的命名空間,盡管Web服務器將為這兩個URL提供同一個文檔。

在命名空間的URL所表示的位置上不需要有任何文檔,XML解析器不會嘗試去該處查找任何東西。然而,為了給可能會遇到不熟悉的命名空間的程序員提供一些幫助,人們習慣于將解釋該命名空間的文檔放在URL位置上。例如,如果你把瀏覽器指向XML Schema的命名空間URL(http://www.w3.org/2001/XMLSchema),就會發現一個描述XML Schema標準的文檔。

為什么要用HTTP URL作為命名空間的標識符?這是因為這樣容易確保它們是獨一無二的。如果使用實際的URL,那么主機部分的唯一性就將由域名系統來保證。然后,你的組織可以安排URL余下部分的唯一性,這和Java包名中的反向域名是一個原理。

盡管長名字空間的唯一性很好,但是你肯定不想處理超出必需范圍的長標識符。在Java編程語言中,可以用import機制來指定很長的包名,然后就可以只使用較短的類名了。在XML中有類似的機制,比如:

現在,該元素和它的子元素都是給定命名空間的一部分了。

子元素可以提供自己的命名空間,例如:

這時,第一個子元素和孫元素都是第二個命名空間的一部分。

無論是只需要一個命名空間,還是命名空間本質上是嵌套的,這個簡單機制都工作得很好。如若不然,就需要使用第二種機制,而Java中并沒有類似的機制。你可以用一個前綴來表示命名空間,即為特定文檔選取的一個短的標識符。下面是一個典型的例子:

下面的屬性:

用于定義命名空間和前綴。在我們的例子中,前綴是字符串xsd。這樣,xsd:schema實際上指的是命名空間http://www.w3.org/2001/XMLSchema中的schema。

注意:只有子元素繼承了它們父元素的命名空間,而不帶顯式前綴的屬性并不是命名空間的一部分。請看下面這個特意構造出來的例子:

在這個示例中,元素configuration和size是URI為http://www.horstmann.com/corejava的命名空間的一部分。屬性si:unit是URI為http://www.bipm.fr/enus/3_SI/si.html的命名空間的一部分。然而,屬性value不是任何命名空間的一部分。

你可以控制解析器對命名空間的處理。默認情況下,Java XML庫的DOM解析器并非“命名空間感知的”。

要打開命名空間處理特性,請調用DocumentBuilderFactory類的setNamespace Aware方法:

這樣,該工廠產生的所有生成器便都支持命名空間了。每個節點有三個屬性:

·帶有前綴的限定名(qualified),由getNodeName和getTagName等方法返回。

·命名空間URI,由getNamespaceURI方法返回。

·不帶前綴和命名空間的本地名(local name),由getLocalName方法返回。

下面是一個例子。假設解析器看到了以下元素:

它會報告如下信息:

·限定名=xsd:schema

·命名空間URI=http://www.w3.org/2001/XMLSchema

·本地名=schema

注意:如果對命名空間的感知特性被關閉,getLocalName和getNamespaceURI方法將返回null。

org.w3c.dom.Node 1.4

·String getLocalName()

返回本地名(不帶前綴),或者在解析器不感知命名空間時,返回null。

·String getNamespaceURI()

返回命名空間URI,或者在解析器不感知命名空間時,返回null。

javax.xml.parsers.DocumentBuilderFactory 1.4

·boolean isNamespaceAware()

·void setNamespaceAware(boolean value)

獲取或設置工廠的namespaceAware屬性。當設為true時,工廠產生的解析器是命名空間感知的。

主站蜘蛛池模板: 凤山县| 洪江市| 界首市| 大宁县| 绍兴县| 高陵县| 洛扎县| 兰州市| 措勤县| 长沙县| 东兰县| 海南省| 石台县| 六安市| 晋州市| 青阳县| 民乐县| 兴山县| 永康市| 峨山| 龙陵县| 昭平县| 辽源市| 吴旗县| 芦山县| 澳门| 平度市| 石首市| 抚松县| 社旗县| 通榆县| 威海市| 江孜县| 子长县| 乌鲁木齐县| 即墨市| 增城市| 柯坪县| 宝坻区| 垫江县| 邵东县|