跳轉到內容

XML - 資料交換管理/名稱空間

來自 Wikibooks,開放世界中的開放書籍



上一章 下一章
JDNC 商業智慧與 XML



學習目標

[編輯 | 編輯原始碼]

完成本章後,您將

  • 能夠理解什麼是 XML 名稱空間及其用途
  • 能夠識別 XML 名稱空間結構以及每個部分的作用
  • 能夠想到需要使用名稱空間的組織

什麼是名稱空間?

[編輯 | 編輯原始碼]

XML 名稱空間是一組由統一資源識別符號 (URI) 引用標識的名稱,這些名稱在 XML 文件中用作元素型別和屬性名稱。使用 URI 僅僅是因為它們是建立唯一識別符號的知名系統。名稱空間包含多個部分,包括本地名稱、名稱空間 URI、字首和宣告。本地名稱和名稱空間的組合稱為通用名稱。您可以將名稱空間視為一個 **字典**,它為 XML 文件中使用的專案提供定義來源。

所有模式都包含名稱空間 http://www.w3.org/2001/XMLSchema-instance。您可以將其視為所有模式都必須引用的主字典,因為它定義了 XML 模式的基本專案。名稱空間的地址看起來像 URL,但在 XML 中,我們使用更廣泛的術語 **統一資源識別符號** (URI)。

由於一個文件可以引用多個名稱空間,我們需要一個方便的簡寫形式來引用名稱空間。其中一種常用形式是 **xsd**,如下所示。

xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"

xlmns 通知 XML 您正在引用一個名稱空間,而 xsd 表示這是名稱空間的簡寫形式。

例如,您可以在 XML 模式中使用以下程式碼行

<xsd:element name="item" type="xsd:string">

上一行程式碼指出,元素名稱和字串的定義在 "http://www.w3.org/2001/XMLSchema-instance" 中找到。

名稱空間使您能夠在 XML 文件中使用多個模式中描述的元素,因此名稱空間 URI 的簡寫形式對於識別您正在引用的名稱空間非常有用。

XML 中的名稱空間是 1999 年 1 月 W3C 的一項新建議。建立名稱空間是為了提供一種非常簡單的區分 XML 文件中使用的名稱的方法。名稱空間的主要目的是為程式設計師提供一種方法,讓他們能夠獲取所需的元素和屬性,同時忽略他們不需要的其他標籤。這些對程式設計師友好的名稱在整個網際網路上將是唯一的。XML 名稱空間建議除了為元素型別和屬性定義兩部分命名系統外,沒有定義其他任何內容。

有關 W3C 建議的更多資訊,請訪問以下連結:http://www.w3.org/TR/REC-xml-names/

何時使用名稱空間?

[編輯 | 編輯原始碼]

它主要用於避免命名衝突。如果您在使用的 XML 中沒有重複的元素或屬性,則不需要名稱空間。但是,如果您有重複的元素或屬性,它將是有益的。它基本上建立了兩個部分的結構,使其變得唯一。例如,您不必只定義元素 A,而是必須使用其他型別的識別符號來定義元素 A。這就是 URI 發揮作用的地方。URI 與元素或屬性的組合建立了您的名稱空間,然後它就成為一個通用名稱。


名稱空間結構

[編輯 | 編輯原始碼]

XML 名稱空間不同於計算學科中通常使用的“名稱空間”,因為 XML 版本具有內部結構,在數學意義上並不是集合。

這是 2 個名稱空間宣告的示例

    <Organization
      xmlns:addr="http://www.example.com/addresses"
      xmlns="http://www.example.com/files"> 


第一個宣告將 addr 字首與“www.example.com/addresses”URI 相關聯。第二個宣告將 www.example.com/files 定義為預設名稱空間。如果沒有為該元素定義字首,則應用預設名稱空間。但是請注意,預設名稱空間不直接應用於屬性。

它是如何工作的?

[編輯 | 編輯原始碼]

在 XML 文件中指定通用名稱時,您使用基於可選字首的縮寫,該字首附加到本地名稱。這種縮寫稱為限定名稱或 qname。要宣告 XML 名稱空間,請使用名稱為以下形式的屬性

xmlns:prefix

這些屬性通常稱為 xmlns 屬性,其值為要宣告的 XML 名稱空間的名稱。這是一個統一資源識別符號。屬性的第一個形式 (xmlns:prefix) 宣告要與 XML 名稱空間關聯的字首。第二個形式 (xmlns) 宣告指定的名稱空間是預設的 XML 名稱空間。

名稱空間最佳實踐

[編輯 | 編輯原始碼]
  • 嘗試將名稱空間的數量限制在每個文件大約 5 個。如果文件中名稱空間超過 5 個,就會變得難以管理。
  • 只有在被命名的事物之間確實存在區別時,才在 XML 名稱空間中進行區分。
  • 儘量將文件保持在名稱空間規範形式,因為它們最容易閱讀和處理。
  • 避免頻繁覆蓋名稱空間,因為它可能會在您的文件中造成混淆。

名稱空間使用示例

[編輯 | 編輯原始碼]

假設我們要從兩個不同的來源獲取地址值,一個來源獲取郵件地址,另一個來源獲取計算機 IP 地址。我們需要建立一個名稱空間,以便能夠區分這兩個地址元素。

郵政地址 XML 文件

<address>100 Elm St., Apt#1</address> 

IP 地址 XML 文件

<address>172.13.5.7</address>

如果需要將這些地址元素組合到同一個文件中,我們如何區分它們?我們將為每個地址名稱分配一個名稱空間。因此,它在兩部分中定義,地址元素和 XML 名稱空間。每次出現地址元素時,它將不得不檢視兩件事而不是一件事來進行定義,但這種查詢只需要執行一次,因為組合是普遍唯一的。

在這種情況下,我們可以為地址元素建立名稱空間

<Example Organization
xmlns: addr="http://www.example.com/postal_addresses"
xmlns="http://www.example.com/ip_addresses">

第一個宣告將字首“addr”與 URI“www.example.com/postal_addresses”相關聯,第二個宣告將“www.example.com/ip_addresses”設定為預設名稱空間。因此,在使用字首“addr”的地方,它將獲取郵政地址,對於其他情況,它將獲取 IP 地址。

定義 XML 架構的位置

[編輯 | 編輯原始碼]

假設您已建立了一個架構,例如 example.xsd,它位於與您的 XML 文件(例如 example.xml)相同的目錄中。在 XML 文件中,您將使用以下程式碼指示架構的位置。

<xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='example.xsd'>

當然,如果 example.xsd 儲存在與 example.xml 相同目錄以外的某個地方,則您需要指定完整路徑。


名稱空間的潛在問題

[編輯 | 編輯原始碼]
  • 不同的 XML 技術將以不同的方式處理名稱空間。有些會將名稱空間宣告視為名稱空間宣告,而有些只會將它們視為屬性。
  • 名稱空間是一種折衷方案,它無法滿足所有使用者的需求。
  • XML 名稱空間表面上看起來很簡單,但如果處理或管理不當,它們會導致真正的混亂和複雜性增加。要正確管理名稱空間,您必須徹底瞭解構成 XML 名稱空間機制的各種概念的含義、規則和含義,並始終堅持簡單的約定。
  • 如最佳實踐中所述,使用超過 5 個名稱空間可能會變得難以控制。那麼,如果需要使用許多名稱空間,大型組織如何解決這種設計難題?這個問題的基本原因是,大多數資訊架構的命名約定是基礎性的,但在 XML 中,它是在事後才修補的。名稱空間很難順利地整合。
華夏公益教科書