曝光臺 注意防騙
網曝天貓店富美金盛家居專營店坑蒙拐騙欺詐消費者
來的使用是未知的。現在我們面臨著一種風險,即文檔里有一個模棱兩可的“ L i g h t”元素。
給< L i g h t >聲明兩種用途非常困難。第一個聲明需有交通信號燈并枚舉它的顏色屬性。枚舉
非常重要,因為對于交通信號燈來說只有三個有效的顏色。一個應用可以基于這些屬性的值用
來做一些錯誤檢查:
194使用XML 高級編程
下載
第二種聲明在它的顏色屬性上沒有特別嚴格的限制。的確,路燈的選擇常常基于價格,而
不是顏色。但顏色還是作了如下描述:
下面看看這段混有兩種D T D的X M L應用文檔:
程序清單7 - 3
從這一點,我們不能區分L i g h t元素指的是交通燈還是街燈(沒有檢查暗含在D T D中的顏色
的限制)。那么一個正在接收的應用程序怎樣知道顏色這個屬性是否可接收呢?我們不知道哪一
個元素查找哪一個D T D,以及第二個L i g h t元素的顏色屬性值對于用于交通燈是無效的。這個問
題對格式正規的文檔就存在多義性。而且如果L i g h t和C o l o r名字需要確認,我們可能會給應用制
造一大堆混亂,這就是提到的名字沖突問題。
7.2 命名空間
XML 命名空間是解決多義性和名字沖突問題的方案。根據W 3 C組織的推薦書“X M L中的命
名空間”(1 9 9 9年1月1 4日):
⋯⋯一種名稱的集合,通過一種U R I引用來標識,作為元素類型和屬性名稱,它應
用于X M L文檔。
命名空間是一組具有結構的名稱的集合;這聽起來像一個D T D,的確,一個D T D可以是一
種命名空間。在這種情況下, U R I可以是在你的服務器上的地址,比如:
h t t p : / / w w w . w r o x . c o m / x m l d t d s / P u b C a t a l o g . d t d
盡管U R I不需要是一個U R L(如果你不能明確二者的差別,我們簡單描述一下它們)。在這
種情況下,命名空間是指在P u b C a t a l o g . d t d里用到的名稱。因此如果我們通過某種方式把使用
B O O K元素與命名空間聯系起來,將會知道在已連接的文檔里任何關于B O O K的引用將要在我們
的P u b C a t a l o g . d t d里涉及到它的用法。
D T D規定了一個文檔的整體結構(并且是那么的準確),我們正好以一個命名空間為資源,
規劃所需要的定義。說到這里,一個命名空間不需要是一個像D T D那樣的有固定結構的定義,
而這個有限的定義領域使命名空間廣泛應用于X M L。如果命名空間是D T D或者模式,我們使用
的定義必須在所描述的結構和語法上保持連續性。但是我們可以自由地使用需要的名稱,并且
使用命名空間來區分元素的使用。
第7章命名空間和模式使用195 下載
于是,為了在文檔里有效地使用命名空間,而文檔中連接著來自不同地方的元素,我們需
要兩部分:
• URI引用,定義了元素的使用方法。
• 一個別名,我們可以用此來標識元素來自哪個命名空間,這將采用元素前綴的形式(例如
在< c a t a l o g : B o o k >那里,c a t a l o g是模糊的B O O K元素的別名)。
7.3 定義和聲明命名空間
看到了命名空間在X M L里所帶來的優點,我們需要仔細看一下如何真正地使用它們。首先看一
下在文檔里怎樣聲明一個命名空間,然后看一下在文檔里怎樣使用命名空間,最后再給出幾個例子。
通常,簡單描述的特性通常作為屬性來建模,并且這就是命名空間是怎樣在X M L聲明的。
但這里有幾個變形與轉化,于是我們將要一步一步地去學習當在一個X M L文檔里聲明一個命名
空間時能描述什么。
7.3.1 聲明一個命名空間
如果每個人在他們打算去認識一個命名空間聲明,我們需要一個保留的詞匯給他們。命名
空間推薦標準給了我們x m l n s。屬性值就是U R I,其唯一地定義了在用的命名空間。U R I經常是
一個指向D T D的U R L,但它并不必須是。用這種方式管理一個U R I,以唯一區分命名空間已經足
夠了。這里有幾個簡單的命名空間聲明:
關于We b資源的術語可能令人混淆。統一資源標識符( U R I )是一些資源的唯一名稱。統
一資源定位器( U R L )根據協議和網絡位置定位資源。第一個例子是U R L,因為它允許一
個瀏覽器利用H T T P從一個特定的位置得到資源。第二個例子給資源命名但沒提供位置。
字面上的u r n來自于U R I。
最初使用命名空間動機之一是能夠從不同的來源混合名稱,從那以來,這對于能夠提供別
名非常有用,而你能在一個涉及到聲明的文檔里通篇使用這個別名。可以靠加個冒號和你的別
名到x m l n s屬性而實現該功能。因此上面的例子就變成了:
在這里前綴c a t a l o g將要涉及到來自P u b C a t a l o g . d t d的元素,而其他的將要涉及在o r d e r. d t d里
聲明的元素。在這些聲明出現之后,我們能只使用B O O K去提及最初的命名空間聲明,以及用
O R D E R去涉及其他的(不用U R I)。使用這些聲明和它們的別名讓我們提供了更多的信息。
圖7 - 1是組成命名空間聲明的部分。
7.3.2 限定名
如果不能和一個我們想要使用的特定的名稱綁定在一起,聲明一個命名空間是沒有什么用
處的。這些已經通過利用限定名做到了。這就可能是你希望的—一個從命名空間勾畫出來并
196使用XML 高級編程
下載
經其限定了的名稱。通過別名創建一個確認過的名稱,確切地說稱作命名空間前綴,并把它放
在名稱的開始。回到在目錄和表單D T D里包括B O O K元素這個問題,假如我們像下面那樣用
c a t a l o g前綴聲明了一個目錄命名空間:
我們能夠使用前綴c a t a l o g,使元素來自哪個命名空間更加明確。于是<catalog:Book />將要
告訴我們B O O K名稱來自catalog 命名空間聲明。同樣Order 命名空間也有B o o k名稱,但限定過
的名稱避免了多義性和沖突的可能性。名稱Ti t l e作為來自一個特殊的命名空間被清楚地驗證過。
命名空間前綴經常被提及為前綴,而名稱本身是基本名。
限定名可被應用于元素和屬性名稱。這里有一個混合一些命名空間的例子:
中國航空網 www.k6050.com
航空翻譯 www.aviation.cn
本文鏈接地址:
XML高級編程上(71)