XML - 資料交換管理/名稱空間
XML - 資料交換管理
|
相關主題
|
參與進來
|
| 上一章 | 下一章 |
| ← 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 地址。
假設您已建立了一個架構,例如 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 中,它是在事後才修補的。名稱空間很難順利地整合。