iT邦幫忙

DAY 18
8

XML系列 第 18

[XML]18-驗證之Schema

本篇的主題是要介紹前面提到的驗證之schema(xsd是其副檔名)。
相較於 DTD,schema 是 XML 界近年來比較廣泛使用來驗證資料格式正確性的做法,基本的使用做法跟 DTD 類似,寫一套用來描述一份 XML 文件格式的語言,再一次,跟 XSL/DTD 一樣,一份 xsd 的型式,仍然是一份 XML ,大概長得如下圖。

這是用來描述下面這個 XML 的結構

接著大致說明schema的內容

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
	<xs:element name="ipo:purchaseOrder">
		<xs:complexType>
			<xs:sequence>
				<xs:element name="shipTo" type="AddressType"/>
				<xs:element name="billTo" type="AddressType"/>
				<xs:element name="Items" type="ItemsType"/>
			</xs:sequence>
			<xs:attribute name="xmlns:ipo" type="xs:string" use="required"/>
			<xs:attribute name="orderDate" type="xs:string" use="required"/>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="AddressType">
		<xs:sequence>
			<xs:element name="name" ref="name"/>
			<xs:element name="street" ref="street"/>
			<xs:element name="city" ref="city"/>
			<xs:element name="state" ref="state"/>
			<xs:element name="zip" ref="zip"/>
		</xs:sequence>
		<xs:attribute name="xsi:type" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:complexType name="ItemsType">	<xs:sequence><xs:element name="item" type="itemType" minOccurs="1" maxOccurs="unbounded"/></xs:sequence></xs:complexType>
	<xs:complexType name="itemType">
		<xs:sequence>
			<xs:element name="productName" ref="productName"/>
			<xs:element name="quantity" ref="quantity"/>
			<xs:element name="price" ref="price"/>
			<xs:element name="ipo:comment" ref="ipo:comment" minOccurs="0" maxOccurs="1"/>
			<xs:element name="shipDate" ref="shipDate"/>
		</xs:sequence>
		<xs:attribute name="partNum" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:element name="productName" type="xs:string"/>
	<xs:element name="quantity" type="xs:string"/>
	<xs:element name="price" type="xs:string"/>
	<xs:element name="ipo:comment" type="xs:string"/>
	<xs:element name="shipDate" type="xs:string"/>
	<xs:element name="name" type="xs:string"/>
	<xs:element name="state" type="xs:string"/>
	<xs:element name="street" type="xs:string"/>
	<xs:element name="city" type="xs:string"/>
	<xs:element name="zip" type="xs:string"/>
</xs:schema>

在 W3C 的規格中,針對 schema 有很詳盡的規範,在這裡我就只針對範例資料做說明,主要目的是可以讓你對 schema 進行一個大概的了解,等到有一天真的派上用場了,再去詳細研究細節。

Line 3-13:最外層的ipo:purchaseOrder,你可以把這種寫法想像成是一隻程式裡的 main(),與 DTD 的差別之一是,DTD 針對欄位結構和屬性是分開描述,而在schema 裡是包在一起,這樣看起來比較一目了然。

Line 14-23:描述名為 AddressType 的 ComplexType,schema 提供了 DTD 沒有的ComplexType 的做法,觀念有點像寫程式裡的可重覆使用模組,以這個例子而言,shipTo 和 billTo,一個是送貨地址,一個是帳單地址,兩者都是相同格式的「地址」,所以沒有重覆描述的必要。做法如上所示,在列14-23宣告一個「AddressType」,然後在列6,列7參照引用

Line 24:描述 Items 和 item 的從屬關係,可以發現到這裡描述 item,是以「minOccurs="1" maxOccurs="unbounded"」的方式表達,語意上更為清楚易懂。

Line 25-34:描述 item 的 ComplexType

Line 35-44:描述最細部的各欄位,這部份 schema 提供了所謂的 Simple Type,用來描述欄位的資料型態,林林總總有三四十種,最常用的就是 string 了

本系列文章列表
Next : [XML]19-文件結構


上一篇
[XML]17-驗證之DTD
下一篇
[XML]19-文件結構
系列文
XML30
0
SunAllen
iT邦高手 1 級 ‧ 2011-10-15 01:09:55

Antijava大大,其實我除了XML不懂之外,我還不懂「Schema」,能開釋一下嗎拍照

0
海綿寶寶
iT邦大神 1 級 ‧ 2011-10-15 12:03:24

我寫了這麼幾篇你還看不懂
證明我寫的真的是「技術」的文章
哈哈

回到最基本的觀念,只有這三點
1.XML是結構化的資料格式
2.schema是描述那個結構的語言,你可以看成是「寫程式的規格文件」
3.schema不是給人看的文件,schema是給「程式」看的規格

要描述一份XML的結構
可以用口語,也可以用Word檔描述(現在大多數都是如此)
但是以上兩者都要經過程式設計人員的「轉換」成程式語言
才可以用程式去檢驗XML格式的正確性
而萬一資料格式有改變(加減欄位...等等)
就得修改程式來配合

如果使用schema的話
就可以不用一直改程式
只要改那份schema就好了

舉例來說
如果你要寫出像http://ithelp.ithome.com.tw/rss/question的XML(註)
就得去讀rss的規格文件然後用程式去產生
產生之後呢?格式對或錯呢?
此時就可以用schema來驗證
而w3c也用rss的schema寫了個線上驗證的服務
只要填入rss的url、按個鍵
立刻就像被X光掃過一樣
駭客

你可以拿iT邦幫忙的http://ithelp.ithome.com.tw/rss/question去給他驗證看看
就可以發現有一堆不合法的格式及資料
飛

註:您或許已知道,有許多的套件可以自動生成RSS的資料,千萬不要自己寫,浪費生命
唱歌

原來如此,我懂了。
我有另一個問題...xml是自訂標簽,那我去開網頁時,我的瀏覽器怎麼會知道,這個標簽是什麼意思?這問題可能很笨...Orz

瀏覽器只認得HTML那些標簽,不認得其他XML的標簽

對瀏覽器而言
<USA></USA><美國></美國><美濃></美濃>
都只是一個XML的標簽
沒什麼特殊差別

0
Ken(Bigcandy)
iT邦大師 1 級 ‧ 2011-10-15 14:34:16

好暈.....不過有個大致了解,推啊!

0
kradark
iT邦好手 1 級 ‧ 2011-10-15 17:59:15

iT邦幫忙MVPantijava提到:
千萬不要自己寫,浪費生命

原來我的生命就這樣浪費掉了→不會xml會短命 (筆記)

筆記

0
chiounan
iT邦研究生 1 級 ‧ 2011-10-15 20:56:23

筆記恩恩

我要留言

立即登入留言