XML DTD比起XML Schema,有不少的缺點(這也就是W3C發展XML Schema的原因)。例如,XML Schema本身是XML文件,使用者可以很容易上手學習。但是XML DTD不是XML之格式,所以對使用者而言還需要特別學習DTD的語法,而且因為不是XML格式,所以無法被XML 剖析器來驗證DTD語法正確不正確。再者,所有在DTD所宣告的元素都是全域變數(Global Variable),所以任何元素一旦你確定宣告,就不可再重複了。至於XML Schema,不但可以設定全域變數,也可以設定區域變數。最後,也是最重要的,就是XML DTD無法對元素或是屬性的值,做更進一步的控制。而XML Schema最大的特色,就是對XML文件內所包含資料或是屬性值,有更多的彈性。例如內含的資料是整數,字串,或是一個時間的區段。
XML Schema
XML Schema本身是一個文字檔案,附屬檔名為.xsd,是一份XML文件,所以XML Schema第一行陳述,一定就是XML文件的宣告,如下:
<?xml version=”1.0” ?> |
接下來我們一定會宣告:
<xsd:schema |
這是用來表示內容為一份XML Schema文件
在上述這個命令後,我們會指出這份schema所使用的命名空間(namespace)。所謂命名空間,我們將在下一期文章中做說明,各位只要把它想成schema中的schema。這通常會指出命名空間所在的URL位址,例如:”http://www.w3.org/2000/10/XMLOSchema” 。所以上一句會宣告成:
<xsd:schema xmlns:xsd=”http://www.w3.org/2000/10/XMLOSchema”> |
最後,不要忘了要在<xsd:schema>這個標籤加上結束標籤,如下:
</xsd:schema> |
最後,一個XML Schema的架構應該都是如下的形式:
<?xml version=”1.0” ?> <xsd:schema xmlns:xsd=http://www.w3.org/2000/10/XMLOSchema”> ……你的Schema定義 </xsd:schema> |
在XML Schema領域內,一個元素(element)可以區分成兩種不同內容型態:簡單及複雜型態(simple 及 complex)。一個元素內的資料若僅僅包含文字(text) ,沒有包含任何屬性(attributes) ,則這是一份簡單的文件;若一個元素包含其他元素,或是包含屬性,這就是所謂複雜的文件。我們先從簡單型態看起。
宣告元素為簡單型態
讓我們先看看一個簡單的XML範例:
|
上述範例的元素分別叫做”company”及”employee”,其值是一段字串以及數字,很明顯的,這兩個元素都是簡單元素,內容只是單純的text,同時沒有包含任何屬性。假如我們要用XML Schema宣告這樣的元素架構的話,步驟應該如下:
1. 宣告元素標籤,語法為<xsd:element
2. 接下來針對元件命名,例如name=”company”
3. 宣告型態,語法:type=”,接下來就是型態的宣告,茲分類如下:
型 態
|
說 明
|
xsd:string | 包含由字元(character)所組成的字串 |
xsd:decimal | 數字 |
xsd:Boolean | true或是false(1或0) |
xsd:date | 日期,格式CCYY-MM-DD |
xsd:time | 時間,格式hh:mm:ss.sss |
xsd:uri-reference | 一段URL |
xsd:language | 元素內容包含ISO639的字母之一 |
xsd:custom | 自行定義的簡單型態 |
4. 加上 ” 結尾字串
5. 加上 /> 結束標籤
根據上面說明,所以我們將上述的XML範例以XML Schema來表示的話應為:
|
其實目前的描述還是很少的,我只是列出幾個代表性的型態。針對每一個單一型態,都有各自衍生的型態。例如以時間或是日期的型態,還有所謂xsd:timeDuration,用來表示一段時間,或是xsd:year,用來表示一個西元年。這些型態這裡就不多述,請各位至W3C網站參考。
宣告元素為複雜型態
複雜型態主要是一個元素又包含另一個元素,或是包含有屬性的元素。主要又分為四種複雜型態:
類 型
|
說 明
|
element only | 一個元素內包含另一個元素或是包含屬性,但是沒有任何值 |
empty | 包含屬性,但沒有包含任何其他元素或是任何值 |
mixed content | 包含其他元素,屬性,值或是前者任一合併混合 |
text only | 包含屬性或是值,沒有其他元素 |
我們分別舉四個範例給各位參考:
XML範例一:element only
|
對employee元素而言,沒有任何值存在,但是他有location這個屬性(也可以沒有任何屬性),同時也包含<name>以及<city>兩個標籤,所以這是一個element only。
XML範例二:empty
|
這兩個元素因為只有包含屬性,沒有任何值以及包含其他元素,所以都是empty的類型。
XML範例三:mixed content
|
對employee元素而言,包含屬性,也包含值”Barkely” ,也有另一個元素<language>,所以是一種混合型態。
XML範例四:text only
<employee location=”Taipei”>Barkely</employee> |
對employee元素而言,包含屬性,也包含值”Barkely”,但是沒有其他元素,所以是text only型態。
要宣告元素為一個複雜型態的步驟說明如下:
1. 宣告元素標籤,語法為<xsd:complexType
2. 接下來針對元件命名,例如name=”company”
3. 輸入右括號>
4. 宣告各元素組合結構,包含有sequence(有順序),choice(多選一),unordered group(無順序性要求的元素 集合)以及named group(命名的元素集合)。
5. 宣告屬性(如果包含屬性的話)
6. 宣告元素結束標籤,語法為</xsd:complexType>
這裡說明一下上述步驟4的部分。因為在複雜型態中,一個元素會包含其他元素,這些元素可能以各種方式出現,例如有按照順序,沒有按照順序,或是多個元素出現其中一個,或是命名一個元素群組,可供其他地方重複引用。不管哪一種,其宣告的步驟都不一樣。下面我們就每個類型以範例做說明:
sequence XSD範例一:
|
上述XSD範例中,第1行的名稱不是元素名稱,是此複雜型態的名稱,各位不要搞錯了。這個XML Schema定義了兩個元素,firstname與lastname,這兩個元素出現的順序必須依照Schema內所規定出現的順序。這邊我們加上<xsd:sequence>的關鍵字,就是表示這是有順序的。我們還加上了兩個屬性:minOccurs及maxOccurs,用來表示出現的次數,從上例來看,表示最少出現要兩次,最多可以無限多次。預設的情況是1,也就是最少出現1次,最多也出現1次。各位可以參考範例如下:
XML範例五
<firstname>Hwang</firstname> <lastname>Barkely</lastname> <firstname>Lin</firstname> <lastname>Chris</lastname> |
choice XSD範例二:
|
這邊我們將關鍵字改成<xsd:choice>字,表示接下來的任一元素可以出現或不出現。同樣的,我們還可加上minOccurs及maxOccurs這兩個屬性,用來表示這個choice集合出現的次數,使用方式與前述相同。各位可以參考範例如下:
XML範例六
<employee> <name>Hwang</name> </employee> <employee> <nickname>Barkely</nickname> </ employee > |
這個範例,元素name及nickname彼此是可選擇的,所以是二選一,只要有一個出現就可以了,所以在employee元素下,name及nickname元素總是指出現一個,不會一起出現。
各位可以回想前一篇有關DTD的定義,一個跟choice相同功能的技術,就是使用到直線符號’|’ ,表示這是一個’or’運算,例如 (north|middle|south) ,表示元素或是屬性的值,只能是north,middle,south三者選一,不可有其他值出現。
unordered group XSD範例三:
|
這邊我們將關鍵字改成<xsd:all>字,表示接下來的任一元素可以任一順序出現。同樣的,我們還可加上minOccurs及maxOccurs這兩個屬性,用來表示all集合本身出現的次數,使用方式與前述相同。各位可以參考範例如下:
XML範例七
|
上述這是正確的,因為三個元素出現的順序並不重要。
Named Group XSD範例四:
在說明範例之前,先說明何謂named group。所謂named group,使用的時機在於當你在建立一份Schema時,當中許多地方,其格式都是相同的,此時你可以針對這一份格式包裝起來,形成一個group,然後給予一個名稱。當一份schema某個地方需要使用這種格式時,直接輸入該名稱即可引用。這樣,此group就可以重複被引用,同時引用的方法只要指明該group的名稱即可。
例如,要定義一個公司組織,其中包含了員工,包含了客戶,由於員工和客戶都有相同的格式,所以我們可以先建立一個group,供其他地方引用。例如:
|
這個範例我們定義一個group,叫做”people” ,其格式包含三個元素,”Firstname”,”Lastname”,以及”age”,資料型態分別是string及integer,出現順序相同。這個group將在其他地方可以被重複引用,這也是使用group最主要的目的。請參考下面範例,在一個XML Schema內如何引用一個group:
Named Group XSD完整範例四
|
請各位注意第5行及第13行,這裡使用了ref=””命令來引用一個group。有了上面這個schema,接下來請各位參考下面的範例,這是依照上述的schema所建立的一份XML文件。各位請注意粗體字部分。
XML範例八
|
XML DTD與XML Schema的差異
XML Schema還有許多特性,但是我們不會全部列出,還望各位自行深入研究,若是往後有提到相關技術,將會再行補充。接下來,我們就將XML DTD與XML Schema的差異,再做一次詳細的差異性做比較,如下表:
XML Schema | XML DTD |
超過44種資料型態 | 10種資料型態 |
可自行定義資料型態 | 不可自行定義 |
本身即為XML文件 | 本身不是XML文件 |
具備物件導向特性 | 無物件導向特性 |
可以延伸或是限制元素型態 | 沒有彈性,無法改變 |
可定義全域變數及區域變數 | 只可定義全域變數 |
可定義元素內容的唯一性 | 無法定義元素內容的唯一性 |
可以定義nil內容 | 無法定義nil |
可定義被取代的元素 | 無法定義被取代的元素 |
結論
XML Schema本身還是很複雜的,由於篇幅關係,許多的特性無法一一列出,我們將在後續的篇幅當中補充說明,各位還可以到W3C網址:http://www.w3.org/XML/Schema,多多參考相關資料。