- Java核心技術·卷Ⅱ:高級特性(原書第10版)
- (美)凱S.霍斯特曼
- 1237字
- 2020-10-30 18:10:50
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時,工廠產生的解析器是命名空間感知的。
- Mastering Concurrency Programming with Java 8
- JavaScript百煉成仙
- Learn Type:Driven Development
- 人臉識別原理及算法:動態人臉識別系統研究
- The Computer Vision Workshop
- 編譯系統透視:圖解編譯原理
- Java性能權威指南(第2版)
- 教孩子學編程:C++入門圖解
- C#程序設計
- Swift細致入門與最佳實踐
- Mastering JavaScript High Performance
- Learning OpenCV 3 Computer Vision with Python(Second Edition)
- C#應用程序設計教程
- Qt5 C++ GUI Programming Cookbook
- Node.js區塊鏈開發