你現在應該知道XML只說明數據的結構而並不關心數據是如何具體描述的、數據是否正確。XML文檔的強制性結構化需求是通過DTD(文檔類型說明)來實現的。那就是本系列文章中先前講述的主題。在本文裡,我們概要介紹DTD所存在的缺點,討論新型的更為強大的標准XML Schema。
--------------------------------------------------------------------------------
其他文章
以下是本系列的另兩篇文章:
XML的基本語法
DTD文檔格式
--------------------------------------------------------------------------------
DTD的麻煩
使用DTD雖然在指定許可的元素、需要的元素以及給定XML文檔中如何組織元素等方面給我們以較大的方便,但是,一旦你想針對特定元素施加數據類型就會遇到麻煩了。DTD規范嚴格地定義了結構,但只支持相對功能較弱的內容類型規范,而對強制性結構化卻無計可施,比如名為Date 的數據如何規定它必須包含有效值呢?
這就要指望XML Schema了,XML Schema目前作為建議已經於2001年提交給了W3C ,這意味著它最終將成為一般用途的建議標准。假如你對此感興趣,你不妨到W3C網站找些官方文檔和內容簡介之類的材料來看看。注意,其他schema定義也是有的,包括日本的標准RELAX 和微軟公司的XDR。可是,XML Schema是唯一受到W3C成為的建議標准,所以我在這篇文章中只對它進行闡述。
XML Schema不僅可以讓你定義XML文檔的結構而且還允許你約束文檔的內容,這就不同於DTD了。另外,一個 XML Schema自身就是一個XML文檔,其基於標簽的語法比DTD中的特殊字符要清楚多了。
Schema概述
XML Schema是用一套預先規定的XML元素和屬性創建的,這些元素和屬性定義了文檔的結構和內容模式。相應的一套精巧的規則(這些規則卻很有意思的用DTD來表示)指定了每個Schema元素或者屬性的合法用途。如果違反這些規則解析器就會拒絕解析你的Schema以及任何同它相聯系的文檔。
現在讓就讓我們來看看清單A中顯示的XML Schema示例,該例對我們以前在清單B中用到的圖書目錄進行了說明。清單B有了點小改動:作為根元素的catalog現在有了兩個新屬性,它們通過清單A中的catalog schema與之關聯。
你再看catalog schema,很快你就會注意到它包含了標准的XML頭,這表示schema自己就是一個XML文檔。而任何schema的根元素都必須是schema,它有一個或者多個說明自己的屬性。在這種情況下,schema的namespace定義屬性(XMLns)會定義名稱空間為xs,它將用作文檔中所有元素的根名稱空間。
--------------------------------------------------------------------------------
什麼是名稱空間
XML把名稱空間定義為包裝XML元素在一起供以後重用的方式。為了使用XML文檔的名稱空間中定義的元素,你必須通過XMLns屬性聲明你希望采用名稱空間。你還必須為該名稱空間定義快捷方式的前綴(例如xs:)作為你文檔中的根元素,從而使得名稱空間在文檔中都可用。前綴是用於文檔的任何導入名稱空間的元素的標識符。這一過程就如同在Visual Basic中給庫加索引或者導入模塊;C++、Java或者.Net下的名稱空間也具有同樣的含義。
--------------------------------------------------------------------------------
我們的schema示例中接下來的元素是annotation,它的作用是代表同其父元素有關的文檔。annotation可以包含兩個子元素之一,或者是documentation或者是appinfo,或者兩者都包含進去。前者用於可讀的文檔,而後者則用來保存供應用程序處理的指令。
接下來我們定義了兩個主要的元素(根元素catalog及其子元素book),它們用在書目文檔內,後者采用了兩個element元素。這些元素都包含了定義名字的屬性和各個元素准許的內容。在這種情況下,catalog元素被定義為catalogtype類型,而book元素則被定義為elementtype類型;這兩種類型以後還要在schema文檔中被定義。