由於XML是SGML(標准通用標示語言)的一個子集,它也繼承了SGML用於建模的DTD。使用DTD的好處是可以利用大量現有的DTD工具,使得開發應用代價維持在一個相對較低的水平。然而,DTD有不少缺陷:
1. DTD是基於正則表達式的,描述能力有限;
2. DTD沒有數據類型的支持,在大多數應用環境下能力不足;
3. DTD的約束定義能力不足,無法對XML實例文檔做出更細致的語義限制;
4. DTD不夠結構化,重用的代價相對較高;
5. DTD並非使用XML作為描述手段,而DTD的構建和訪問並沒有標准的編程接口,無法使用標准的編程方式進行DTD維護。
XML Schema正是針對這些DTD的缺點而設計的,它完全使用XML作為描述手段,具有很強的描述能力、擴展能力和處理維護能力。
XML Schema簡介
XML Schema的主要目的是用來定義一類XML文檔(一個XML Application)。因此,模式的“實例文檔”形式常常被用於描述一個與特定XML Schema相一致的XML文檔。事實上,文檔實例和Schema文檔都不是必須要以文檔的形式存在,它們可以以在應用之間傳遞的字節流的形式存在,或者作為一個數據庫記錄及XML的“信息項”的集合存在。然而為了簡化入門,我們總是把實例和模式看作文檔或者文件,認為它們總以文檔實例或是模式文檔的形式存在。
這裡我們將結合一個實例來對XML Schema進行簡單的概述,希望大家通過閱讀本節的內容初步掌握的使用方法和XML Schema文檔實例的具體語義。XML Schema是Web Services技術中需要使用的一個基本工具,然而並不是XML Schema的所有特性都會被廣泛地使用,因此,本文將不對XML Schema規范做系統的介紹。
在介紹XML Schema語法之前,先來考慮一個XML實例文檔po.xml。它描述了一個由家庭產品采購/支付應用生成的家庭產品購買訂單(參閱代碼1)。
<!--代碼 1 po.xml,購買訂單的XML實例文檔-->
<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20">
<shipTo country="US">
<name>Alice Smith</name>
<street>123 Maple Street</street>
<city>Mill Valley</city>
<state>CA</state>
<zip>90952</zip>
</shipTo>
<billTo country="US">
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
<city>Old Town</city>
<state>PA</state>
<zip>95819</zip>
</billTo>
<comment>Hurry, my lawn is going wild!</comment>
<items>
<item partNum="872-AA">
<productName>Lawnmower</productName>
<quantity>1</quantity>
<USPrice>148.95</USPrice>
<comment>Confirm this is electric</comment>
</item>
<item partNum="926-AA">
<productName>Baby Monitor</productName>
<quantity>1</quantity>
<USPrice>39.98</USPrice>
<shipDate>1999-05-21</shipDate>
</item>
</items>
</purchaseOrder>
這個購買訂單由一個跟元素purchaseOrder及其子元素shipTo、billTo、comment和items組成。這些子元素(除了comment)也依次包含了其它的一些子元素。
葉子元素包含的是一個數字而不是任何子元素,如USPrice這樣的子元素。元素如果包含子元素或者是帶有屬性的,被稱為復合類型;反之元素如果僅僅包含數字、字符串或者其它數據等,但不包含任何子元素的,則被稱為簡單類型。在這個實例文檔中,復合類型和一些簡單類型是在購買定單的模式文檔中定義的,而其它一些標准的簡單類型則是作為XML Schema內置的簡單類型的形式出現的。
在研究這個實例文檔的購買訂單模式文檔之前,先介紹一下購買訂單實例文檔和模式文檔之間的聯系。一個實例文檔實際上並不一定需要引用模式文檔,當然,在事實上的使用中,很多實例文檔確實引用了模式文檔,