請開始使用 XML 模式來約束 XML 文檔。這篇簡短的技巧說明會告訴您如何從 XML 文檔中引用 XML 模式。五段樣本代碼將顯示如何實現。
隨著 W3C 最近確定了 XML 模式規范,您可能應開始使用模式了。與使用 DTD(文檔類型定義)定義約束相比,模式可以給您更好的靈活性和確定性。本技巧說明演示了使用模式的一個重要部分:如何在文檔中引用它們。即使其他人正在編寫模式,您可能需要知道如何在 XML 文檔中引用它們。
首先,讓我簡要地比較一下以供參考。在 XML 模式之前,每個人都使用 DTD 來進行約束,而且很多人現在仍這么做。要使用 DTD 進行約束,應在 XML 文檔中使用 DOCTYPE
聲明來引用 DTD,如“清單 1”所示:
清單 1. 引用 DTD
<?xml version="1.0"?>
<DOCTYPE hockeyTeam SYSTEM "dtd/hockeyTeam.dtd">
<hockeyTeam>
<team name="Dallas Stars">
? <!-- More XML Content -->
</team>
</hockeyTeam>
在“清單 1”的文檔中,所引用的 DTD 名叫 hockeyTeam.xml
,它在目錄 dtd
中。可以在 XML 文檔的 DOCTYPE
標記中指定約束,以代替在獨立的 DTD 文檔中指定約束。對于這個示例,我使用了一個擁有 XML 約束的獨立 DTD 文檔,因為這是一個更好的設計,而且因為它與需要使用 XML 模式的方法類似。
除了理解 XML 的基礎,您還需要掌握 XML 名稱空間規范的一些知識(請參閱
參考資料
)。該規范的優點超出了本篇技巧說明的范圍,但您需要知道的是名稱空間基本上是將一個前綴(如 nhl
)綁定到某個特定 URI(如 http://www.nhl.com)。可以將前綴添加到元素名稱的開頭(例如, nhl:hockeyTeam
),以便將該元素放到相關 URL 標識的名稱空間中。如果指定了 URL,但是 沒有指定前綴,那么該名稱空間會成為 缺省名稱空間;沒有前綴的元素將落入缺省名稱空間。“將缺省名稱空間看作是帶有空的前綴的名稱空間”可能會對理解它有所幫助。名稱空間聲明的使用及其前綴讓您可以在一個模式使用多個名稱空間中的元素定義。
一個 XML 模式可以對一個名稱空間設置約束。因此,如果在一個 XML 文檔中有 4 個名稱空間,而且您要約束所有名稱空間中的所有元素,通常需要 4 個 XML 模式。對于每個名稱空間,都需要指定約束該名稱空間的模式。再次聲明,名稱空間在內容和功能之間提供了一種很好的分離方法。
好,基礎知識已經介紹得足夠多了;現在切入正題。
首先需要在文檔中聲明“XML 模式實例”名稱空間,以授予您對引用 XML 模式時需要的屬性的訪問權。當然,要添加前綴映射( xsi
)和相關 URI,如“清單 2”中所示。我還添加了一個缺省名稱空間 http://www.nhl.com,以便為文檔中的所有無前綴元素提供駐留地(在本示例中,所有元素都是無前綴元素)。
清單 2. 定義“XML 模式實例”名稱空間
<?xml version="1.0"?>
<hockeyTeam xmlns="http://www.nhl.com"
??????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<team name="Dallas Stars">
? <!-- More XML Content -->
</team>
</hockeyTeam>
一旦“XML 模式實例”名稱空間可用,就可以使用其內部的 schemaLocation
屬性了。該屬性的值其實是 兩個值。第一值,或自變量,是要約束的名稱空間。在本示例中,這個值是 http://www.nhl.com
,即缺省名稱空間。第二個值,或自變量,是用于名稱空間約束的 XML 模式的位置。要查看這個值,請參考“清單 3”:
清單 3. 引用 XML 模式
<?xml version="1.0"?>
<hockeyTeam xmlns="http://www.nhl.com"
??????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??????????? xsi:schemaLocation="http://www.nhl.com schemas/hockeyTeam.xsd">
<team name="Dallas Stars">
? <!-- More XML Content -->
</team>
</hockeyTeam>
請注意名稱空間 URI 和模式之間的空格。 插入該空格需小心;省去這個空格會給您帶來各種麻煩!此外,請注意,模式位置可以就是一個 URI,如“清單 4”所示:
清單 4. 使用 URI 作為模式位置
<?xml version="1.0"?>
<hockeyTeam xmlns="http://www.nhl.com"
??????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??????????? xsi:schemaLocation="http://www.nhl.com
??????????????????????????????? http://www.nhl.com/hockeyTeam.xsd">
<team name="Dallas Stars">
? <!-- More XML Content -->
</team>
</hockeyTeam>
好了。添加新的名稱空間和模式很簡單,只涉及到將 第二(或第三或第四)對值添加到 schemaLocation
屬性。清單 5 將一個新的名稱空間添加到 XML 文檔中,并且添加了另一個與其相關的模式。
清單 5. 引用多個模式
<?xml version="1.0"?>
<hockeyTeam xmlns="http://www.nhl.com"
??????????? xmlns:stars="http://www.dallasstars.com"
??????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
??????????? xsi:schemaLocation="http://www.nhl.com
http://www.nhl.com/hockeyTeam.xsd
http://www.dallasstars.com http://www.dallasstars.com/stars.xsd"">
<team name="Dallas Stars" stars:logo="http://www.dallasstars.com/logo.jpg">
? <!-- More XML Content -->
</team>
</hockeyTeam>
如果您正在使用模式或者打算使用它們,那么您一定要掌握 XML 模式規范(從第 0 部分開始),因為在引用模式、使用模式(無論帶不帶名稱空間)和設計文檔約束時有許多選項。無論您使用這些特性的哪種組合,請明智地約束 XML,玩得開心點!
-
您可以參閱本文在 developerWorks 全球站點上的
英文原文
.
-
請在
The Basics of using XML Schema to define elements
中快速學習如何使用 XML 模式。
-
請在 W3C 站點上完整地復習 XML 模式:
- XML Schema Part 0: Primer ,一個好去處,包含了如何應用 XML 的詳細概述和一些說明
- XML Schema Part 1: Structures
- XML Schema Part 2: Datatypes
-
請研究
XML Namespaces specification
。
-
請閱讀兩個開發者對 XML 模式的觀點:David Mertz 在
XML 問題專欄
中比較了 DTD 和 XML 模式,并推薦了一些更適合使用 DTD 的情況。在 XML 專區
Soapbox opinion piece
中,信息管理開發者兼作家 Kevin Williams 講述了對于使用 XML 的數據庫開發者來說,XML 模式為什么是一種極為方便的方式。
-
dW XML 專區專欄作家 Kevin Williams 刊登了兩篇討論 XML 模式問題的專欄文章,這兩篇文章以建立原型為目的,以便處理結構化數據:
Using XML Schema archetypes
描述了概念,
XLink and data
演示了實際應用程序。
-
請了解
IBM WebSphere Application Server
及其對 XML 模式支持的更多信息。
- 如果您不能理解這些內容,請在 developerWorks Intro to XML tutorial 中專心學習 XML 基礎知識。