XML Schema

来源:互联网 发布:网络电影票房排行 编辑:程序博客网 时间:2024/05/29 15:29

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範例:


1. <company>倍力資訊股份有限公司</company>
2. <employee>50</employee>

上述範例的元素分別叫做”company”及”employee”,其值是一段字串以及數字,很明顯的,這兩個元素都是簡單元素,內容只是單純的text,同時沒有包含任何屬性。假如我們要用XML Schema宣告這樣的元素架構的話,步驟應該如下:

1. 宣告元素標籤,語法為<xsd:element
2. 接下來針對元件命名,例如name=”company”
3. 宣告型態,語法:type=”,接下來就是型態的宣告,茲分類如下:

型 態
說 明
xsd:string包含由字元(character)所組成的字串xsd:decimal數字xsd:Booleantrue或是false(1或0)xsd:date日期,格式CCYY-MM-DDxsd:time時間,格式hh:mm:ss.sssxsd:uri-reference一段URLxsd:language元素內容包含ISO639的字母之一xsd:custom自行定義的簡單型態

4. 加上 ” 結尾字串
5. 加上 /> 結束標籤

根據上面說明,所以我們將上述的XML範例以XML Schema來表示的話應為:


<xsd:element name=”company” type=”xsd:string” />
<xsd:element name=”employee” type=”xsd:integer” />

其實目前的描述還是很少的,我只是列出幾個代表性的型態。針對每一個單一型態,都有各自衍生的型態。例如以時間或是日期的型態,還有所謂xsd:timeDuration,用來表示一段時間,或是xsd:year,用來表示一個西元年。這些型態這裡就不多述,請各位至W3C網站參考。

宣告元素為複雜型態

複雜型態主要是一個元素又包含另一個元素,或是包含有屬性的元素。主要又分為四種複雜型態:

類 型
說 明
element only一個元素內包含另一個元素或是包含屬性,但是沒有任何值empty包含屬性,但沒有包含任何其他元素或是任何值mixed content包含其他元素,屬性,值或是前者任一合併混合text only包含屬性或是值,沒有其他元素四種複雜型態

我們分別舉四個範例給各位參考:

XML範例一:element only


<employee location=”Taipei”>
<name language=”English”>Barkely</name>
<city>Taipei</city>
</employee>

對employee元素而言,沒有任何值存在,但是他有location這個屬性(也可以沒有任何屬性),同時也包含<name>以及<city>兩個標籤,所以這是一個element only。

XML範例二:empty


<employee location=”Taipei”>
<city name=”Taipei” />

這兩個元素因為只有包含屬性,沒有任何值以及包含其他元素,所以都是empty的類型。

XML範例三:mixed content


<employee location=”Taipei”>Barkely
<language>English</language>
</employee>

對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範例一:

1.
2.
3.
4.
5.
6.<xsd:complexType name=”employeeType”>
 <xsd:sequence minOccurs=”2” maxOccurs=”unbounded”>
  <xsd:element name=”firstname” type=”xsd:string”
  <xsd:element name=”lastname” type=”xsd:string”
 </xsd:sequence>
</xsd:complexType>

上述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範例二:

1.
2.
3.
4.
5.
6.<xsd:complexType name=”employeeType”>
 <xsd:choice”>
  <xsd:element name=”name” type=”xsd:string”
  <xsd:element name=”nickname” type=”xsd:string”
 </xsd:choice>
</xsd:complexType>

這邊我們將關鍵字改成<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範例三:

1.
2.
3.
4.
5.
6.
7.<xsd:complexType name=”company”>
 <xsd:all”>
  <xsd:element name=”name” type=”xsd:string”
  <xsd:element name=”location” type=”xsd:string”
  <xsd:element name=”employees” type=”xsd:integer”
 </xsd:all>
</xsd:complexType>

這邊我們將關鍵字改成<xsd:all>字,表示接下來的任一元素可以任一順序出現。同樣的,我們還可加上minOccurs及maxOccurs這兩個屬性,用來表示all集合本身出現的次數,使用方式與前述相同。各位可以參考範例如下:

XML範例七

<Mpower>
 <name>倍力資訊股份有限公司</name>
 <employees>50</employees>
 <location>Taipei</location>
</Mpower>
<Mpower>
 <name>倍力資訊股份有限公司高雄分公司</name>
 <location>Kaohsiung</location>
 <employees>50</employees>
</Mpower>

上述這是正確的,因為三個元素出現的順序並不重要。

Named Group XSD範例四:

在說明範例之前,先說明何謂named group。所謂named group,使用的時機在於當你在建立一份Schema時,當中許多地方,其格式都是相同的,此時你可以針對這一份格式包裝起來,形成一個group,然後給予一個名稱。當一份schema某個地方需要使用這種格式時,直接輸入該名稱即可引用。這樣,此group就可以重複被引用,同時引用的方法只要指明該group的名稱即可。

例如,要定義一個公司組織,其中包含了員工,包含了客戶,由於員工和客戶都有相同的格式,所以我們可以先建立一個group,供其他地方引用。例如:

<xsd:schema>
<xsd:group name=”people”>
<xsd:sequence>
<xsd:element name=”Firstname” type=”xsd:string”/>
<xsd:element name=”Lastname” type=”xsd:string”/>
<xsd:element name=”age” type=”xsd:integer”/>
</xsd:sequence>
</xsd:group>
……一個名叫”people”的group

這個範例我們定義一個group,叫做”people” ,其格式包含三個元素,”Firstname”,”Lastname”,以及”age”,資料型態分別是string及integer,出現順序相同。這個group將在其他地方可以被重複引用,這也是使用group最主要的目的。請參考下面範例,在一個XML Schema內如何引用一個group:

Named Group XSD完整範例四

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

<xsd:element name=”employee”>
 <xsd:complexType>
  <xsd:sequence>
  <xsd:element name=”employee_id” type=”xsd:integer”/>
  <xsd:group ref=”people”/>
  </xsd:sequence>
 </xsd:complexType>
</xsd:element>

<xsd:element name=”customer”>
 <xsd:complexType>
   <xsd:element name=”customer_id” type=”xsd:integer”/>
   <xsd:group ref=”people” />
  </xsd:complexType>
</xsd:element>

請各位注意第5行及第13行,這裡使用了ref=””命令來引用一個group。有了上面這個schema,接下來請各位參考下面的範例,這是依照上述的schema所建立的一份XML文件。各位請注意粗體字部分。

XML範例八

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

<employee>
 <employee_id>100</employee_id>
 <Firstname>Hwang</Firstname>
 <Lastname>Barkely</Lastname>
 <age>30</age>

</employee>
<customer>
 <customer_id>9991</customer_id>
 <Firstname>Lin</Firstname>
 <Lastname>Chris</Lastname>
 <age>24</age>

</customer>

XML DTD與XML Schema的差異

XML Schema還有許多特性,但是我們不會全部列出,還望各位自行深入研究,若是往後有提到相關技術,將會再行補充。接下來,我們就將XML DTD與XML Schema的差異,再做一次詳細的差異性做比較,如下表:

XML SchemaXML DTD超過44種資料型態10種資料型態可自行定義資料型態不可自行定義本身即為XML文件本身不是XML文件具備物件導向特性無物件導向特性可以延伸或是限制元素型態沒有彈性,無法改變可定義全域變數及區域變數只可定義全域變數可定義元素內容的唯一性無法定義元素內容的唯一性可以定義nil內容無法定義nil可定義被取代的元素無法定義被取代的元素XML Schema與XML DTD的差異

結論

XML Schema本身還是很複雜的,由於篇幅關係,許多的特性無法一一列出,我們將在後續的篇幅當中補充說明,各位還可以到W3C網址:http://www.w3.org/XML/Schema,多多參考相關資料。

下一篇我們將談到命名空間(namespace),這在使用XML上是一定要了解的觀念。

原创粉丝点击