2013年2月12日 星期二

XML命名空間(Name Space)

關於Name Space有人稱作命名空間或者名稱空間,對於沒接觸過這個字的人比較陌生,其實「命名空間(Name Space)」簡單來說就是一個專門存放命名規則的空間。以XML語言來說,就是存放了關於XML標籤及屬性命名的定義,這樣負責文件解析的程式才知道如何解析該文件。

而命名空間的設計,可以避免標籤之間的命名相同造成的衝突讓文件無法正確解析出來。
舉例來說:以下是一份關於描述HTML格式的XML文件:
<table>
  <tr>
    <td>Name</td>
    <td>Sex</td>
    <td>Age</td>
  </tr>
</table>
簡單來說就是在螢幕上顯示三個有Name、Sex以及Age欄位的表格,為何會顯示出表格而不是只有輸出類似程式碼的文字,也是由於我們使用的XML文件解析器(也就是網頁瀏覽器)的設計會根據文件的命名空間判定此文件為HTML格式,將其輸出為表格的樣式。

假設我們自己定義了一個XML文件:
<table>
   <name>Ryan</name>
   <sex>Male</sex>
   <age>30</age>
</table>
以上的文件是在描述說我有一張表格,而裡面有一些個人的基本資料。

但是如果我將自行定義的這些程式片段加入以上的文件中,便會有所謂的命名衝突的問題,因為兩個程式片段中都包含了<table>這個元素,所以XML解析器會不清楚要如何分辨以及處理該文件。


因此我們就需要手動去做宣告的動作,將上面的程式片段宣告為HTML,而下面的文件宣告為自定義的文件。

宣告命名空間的語法是:
xmlns:prefix="URI"
一般來說URI看起來都是網址,但是XML解析器並不是到這個網址擷取關於命名空間的資訊,它只是一組獨一無二的識別字,只是有些人會順便把命名空間相關的資訊放到此網址上面,好讓使用者可以輕易了解文件資訊。
例如:http://www.w3.org/TR/html4/

透過 xmlns 這一個屬性來做宣告 Name Space 的動作:
<h:table xmlns:h="http://www.w3.org/TR/html4/">
  <h:tr>
    <h:td>Name</h:td>
    <h:td>Sex</h:td>
    <h:td>Age</h:td>
  </h:tr>
</h:table>

<p:table xmlns:p="http://www.mydomain.com/profile">
   <p:name>Ryan</p:name>
   <p:sex>Male</p:sex>
   <p:age>30</p:age>
</p:table>
xmlns後面接的「h:」以及「p:」的就是在宣告該標籤的命名空間(自行定義),每一個開頭標籤和結尾標籤都要加上此「字首(Prefix)」。

我們也可以透過 root 標籤統一來定義文件,這樣一來整份文件都會在有效範圍內:
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:p="http://www.mydomain.com/profile" >

<h:table>
  <h:tr>
    <h:td>Name</h:td>
    <h:td>Sex</h:td>
    <h:td>Age</h:td>
  </h:tr>
</h:table>

<p:table>
   <p:name>Ryan</p:name>
   <p:sex>Male</p:sex>
<   <p:age>30</p:age>
</p:table>
此外當您宣告xmlns後,該標籤底下的的子標籤,都會使用相同的命名空間,所以其實我們可以將xmlns後面的省略「字首」宣告,而子標籤內「字首」也全部拿掉:
<table xmlns="http://www.w3.org/TR/html4/">
  <tr>
    <td>Name</td>
    <td>Sex</td>
    <td>Age</td>
  </tr>
</table>

<table xmlns="http://www.mydomain.com/profile">
   <name>Ryan</name>
   <sex>Male</sex>
   <age>30</age>
</table>
這樣是不是簡單明瞭多了呢。

參考網站:
http://www.w3schools.com/xml/xml_namespaces.asp

2 則留言: