天天看點

XML Namespace 命名空間

根據 Namespaces in XML W3C 推薦标準的定義,XML 命名空間 是由國際化資源辨別符 (IRI) 辨別的 XML 元素和屬性集合;該集合通常稱作 XML“詞彙”。

定義 XML 命名空間的主要動機之一是在使用和重用多個詞彙時避免名稱沖突。XML 模式用于為 XML 執行個體建立一個詞彙并頻繁使用命名空間。是以,正确了解命名空間概念對于從總體上了解 XML 模式和執行個體驗證至關重要。

命名空間在多個方面類似于 Java 中的程式包:

  • Java 中的程式包可以包含許多可重用的類和接口。同樣,XML 中的命名空間可以有許多可重用的元素和屬性。
  • 要使用程式包中的類或接口,必須使用程式包名稱完全限定該類或接口。同樣,要使用命名空間中的元素或屬性,必須使用命名空間完全限定該元素或屬性。
  • Java 程式包可能有一個内部類,該類并不直接位于程式包内部,而是借助它的外圍類“屬于”該程式包。命名空間也是如此:某些元素或屬性可能并不直接在命名空間中,而是借助它的父元素或外圍元素而屬于命名空間。這是一個傳遞關系。如果桌子上有一本書,而桌子在地面上,則根據傳遞關系,這本書位于地面上;盡管這本書并非 直接位于地面上。

是以,可以看出 XML 概念中的命名空間與 Java 中的程式包并無多大差別。這種對比旨在簡化對 XML 中命名空間的了解,并幫助您直覺認識命名空間的概念。

在本文中,您将了解:

  • 命名空間在 XML 中的作用
  • 如何聲明和使用命名空間
  • 預設命名空間與無命名空間之間的差別
  • 如何使用 XML 模式建立命名空間,以及
  • 命名空間中的限定和非限定元素/屬性之間的差別。

聲明和應用命名空間

命名空間被聲明為元素的屬性。并不一定隻在根元素聲明命名空間;而是可以在 XML 文檔中的任何元素中進行聲明。聲明的命名空間的範圍起始于聲明該命名空間的元素,并應用于該元素的所有内容,直到被具有相同字首名稱的其他命名空間聲明覆寫—其中,元素内容是指該元素的 和 之間的内容。命名空間聲明如下:

在屬性 xmlns:pfx 中,xmlns 類似于一個保留字,它隻用于聲明命名空間。換言之, xmlns 用于綁定命名空間,但其本身并不綁定到任何命名空間。是以,以上示例實際上是将字首“pfx”與命名空間“http://www.foo.com”綁定在一起。

通常将 XSD 或 XS 用作 XML 模式命名空間的字首,但具體使用什麼字首完全取決于個人。您可以選擇将字首 ABC 用于 XML 模式命名空間,這是合法的,但沒有什麼意義。使用有意義的命名空間字首增強了 XML 文檔的清晰性。請注意,字首隻用作占位符,并且必須通過可以識别命名空間的 XML 分析器進行解釋才能使用綁定到該字首的實際命名空間。在 Java 類比中,命名空間綁定可以比作聲明一個變量,并且每當引用該變量時,它将被所賦與的值替換。

在上一個命名空間聲明示例中,每當在命名空間範圍中引用字首“pfx”時,它将被解釋為綁定到實際的命名空間 ( http://www.foo.com):

在 Java 中: String pfx = “http://www.library.com”

在 XML 中:

盡管命名空間通常看上去像 URL,但這并不意味着實際聲明和使用命名空間時一定要連接配接到網際網路上。實際上,通常将命名空間用作可以在互連網空間中共享詞彙和不顯示内容的虛拟“容器”。在互連網空間中,URL 是唯一的—是以,您通常選擇使用 URL 來唯一辨別命名空間。在浏覽器中鍵入命名空間 URL 并不意味着它将顯示該命名空間中的所有元素和屬性;它隻是一個概念。

但這裡存在一種誤解:盡管 Namespaces in XML W3C 推薦标準聲明該命名空間名稱應為 IRI,但它對此并無強制規定。是以,我還可以使用以下代碼:

該代碼完全合法。

至此應明了,要使用命名空間,首先應使用字首綁定将其綁定,然後在需要時使用該字首。但為什麼不能從一開始便使用命名空間限定元素或屬性呢?首先,由于命名空間(作為 IRI)非常長,是以毫無疑問會使 XML 文檔雜亂不堪。第二,也是最重要的,它可能對文法造成嚴重影響,或者具體一點說,可能對 XML 的生産規則造成嚴重影響—原因是 IRI 可能包含 XML 1.0 W3C 推薦标準 不允許在 XML 标記中使用的字元。

無效)

http://www.library.com:Book /

有效) lib:Book xmlns:lib=”http://www.library.com” /

下面的元素 Title 和 Author 與命名空間 http://www.library.com 關聯:

<?xml version="1.0"?>
<Book xmlns:lib="http://www.library.com">
    <lib:Title>Sherlock Holmes</lib:Title>
    <lib:Author>Arthur Conan Doyle</lib:Author>
</Book>