Schema 與DTD的比較 XML Schema 的特性 XML 資料型態 XML Schema 屬性宣告
簡介 現今 XML 最主要的功能是在程式、系統或是公司、組織之間交換資料,所以資料的正確性是相當重要的。資料的結構與格式的正確是基礎要求,這可以透過 XML Schema 或是 Document Type Definition (DTD) 來定義。 XML Schema 提供比 DTD 更多的彈性,且與 XML 語法相容,所以是較好的選擇。
Schema 與 DTD 的比較 DTD 的缺點 DTD 採用與 XML 不同的語法 無法支援名稱空間(Namespace) 僅能支援有限的資料型態 建立於字串取代的延伸機制(參數實體)
XML Schema的特性 XML Schema 本身就是一份良好格式的XML文件。 XML Schema 支援更多XML元素的「資料型態」,可以定義各種XML元素的資料型態。 XML Schema支援名稱空間,比起DTD擁有更大的擴充性。
結構 XML Schema 和 DTD 定義了一篇 XML 文章內可以使用的元素和屬性。XML Schema 提供比 DTD 更嚴格的定義。
結構 常用的Schema元素如下表所示: 元素 說明 schema XML Schema文件的根元素 simpleType 使用者自已定義的資料型態 element 宣告XML元素 complexType 宣告XML元素的子元素 attribute 宣告元素的屬性
XML Schema 資料型態 XML Schema 支援多達四十種以上的資料型態,而且允許使用者自定資料型態,這些資料型態是使用在XML元素和屬性內容。
內建資料型態 <xsd:element name=“code” type=“xsd:string”/> XML Schema支援內建資料型態,能夠直接用來定義XML元素或屬性的內容,如下所示: 上述指令的type屬性使用的就屬於內建資料型態string和decimal,用來定義XML元素code和price內容的資料型態。 <xsd:element name=“code” type=“xsd:string”/> <xsd:element name=“price” type=“xsd:decimal”/>
基本資料型態 XML Schema 內建的資料型態都是由一些基本資料型態所產生,如下表所示: 資料型態 格式說明 string “HELLO” recurringDuration 時間資料 boolean true,1,false,0 uriReference URL網址 float 浮點數字 ID 唯一的號碼 double 雙精度浮點數 IDREF 其他ID屬性值 decimal 數字 ENTITY 實體 timeDuration NOTATION 參考的記法
自訂資料型態 當需要替XML元素或屬性自訂資料型態時,我們需要使用simpleType元素定義所需的資料型態,語法如下所示: <simpleType name=“name” base=“datatypes”> <facets_element value=“value”/> ………… </simpleType>
自訂資料型態(續) 前頁simpleType元素的屬性說明如下: Name屬性:使用者自訂資料型態的名稱。 Base屬性:基底的資料型態,例如:string , boolean , float , double , decimal…等。
自訂資料型態(續) 在simpleType元素的子元素facets_element就是在描述資料型態的細節,如下所示 元素 說明 minInclusive 內容的最小且包含在內的值 maxInclusive 內容的最大且包含在內的值 minExclusive 內容的最小值但不包含在內 maxExclusive 內容的最大值但不包含在內 length 元素內容的長度 minLength 元素內容的最小長度 maxLength 元素內容的最大長度 pattern 正規語言的元素內容 enumeration 定義列舉元素內容
自訂資料型態(續) 定義數字範圍: 使用simpleType元素定義一個範圍的數字資料型態,例如訂購的數量最少為1,最大為100,如下所示: 上述指令轉換成數學運算示可表示成: 0<=OrderQuantity<=100 <simpleType name=“OrderQuantity” base=“integr”> <minInclusive value=“1”/> <maxInclusive value=“100”/> </simpleType>
自訂資料型態(續) 定義列舉的元素內容 如果元素內容為列與清單中的其中之一,如:色彩值紅、白、黑、和藍,如下所示。 <simpleType name=“color” base=“string”> <enumeration value=“red”/> <enumeration value=“white”/> <enumeration value=“blue”/> <enumeration value=“black”/> </simpleType>
自訂資料型態(續) 正規語法 當我們需要定義一個字串的模型如 02-22222222時,可以用以下的指令: <simpleType name=“PhoneNumver” base=“string”> <length value=“11”/> <pattern value=“\d{2}-\d{8}”/> </simpleType>
自訂資料型態(續) 上頁的\d代表數字,前二位,後八位,中間有個“-”符號,一些常用的正規語法如下: 正規語法 範例 Chap\d \d為數字,例如Chap1,Chap2 a*b *為任何次數的重複字元,例如b、ab、aab [xyz]a []內的字元為任一,例如xa、ya、za b?c ?為0或1,例如c、bc a+b +為最小一次重覆字元,例如ab、aab、aaab [a-d]x 定義範圍,例如ax、bx、cx、dx a{1,3}x 定義字元個數為1到3,例如ax、aax、aaax
XML元素宣告 XML Schema的目的就是在宣告XML文件的元素,目前共有兩種方法進行宣告,第一種是參考其他已經定義好的資料型態,另一種就是使用complexType元素同時定義字元素和資料型態,首先我們先來看看第一種元素宣告,使用的為element元素,基本的語法如下所示: <element name=“name” type=“type“ minOccurs=“int” maxOccurs=“int”/>
XML元素宣告(續) 上頁的宣告各屬性參數說明如下: name屬性:此為XML元素名稱。 type屬性:XML元素內容的資料型態,可為內建資料型態、simpleType和complexType 元素宣告的資料或名稱型態。 minOccurs屬性:元素最少出現的次數。 maxOccurs屬性:元素最多出現的次數,如為unbounded表示無限次數。
XML元素宣告(續) minOccurs和maxOccurs屬性值和其意義,相對於DTD指令如下表所示: minOccurs 說明 0 1 0或1,相當於DTD的「?」 出現一次 Unbounded 0或無限,相當於DTD的「*」 unbounded 1或無限,相當於DTD的「+」
內建資料型態 如果XML元素內容為內建資料型態,且沒有擁有其他子元素,此時便可直接使用內建資料型態宣告XML元素。 上述element元素宣告一個title的XML元素,此元素為字串string,而且只會出現一次。 <element name=“title” type=“string” minOccurs=“1” maxOccurs=“1”/>
內建資料型態(續) 如果XML擁有固定值,此時可使用fixed屬性指定元素值。 上述XML元素zero的值為0,因為我們使用fixed屬性指定其值。 <element name=“zero” type=“unsignedByte” fixed=“0” minOccurs=“1” maxOccurs=“1”/>
simpleType元素 對於比較複雜的資料型態,例如:ISBN圖書書號,我們可以用simpleType元素定義所需的新資料型態,如下: <simpleType name=“ISBNType” base=“string”> <pattern value=“\d{3}-\d{3}-\d{3}-\d{1}”/> </simpleType>
simpleType元素(續) 在定義好所需的資料型態後,我們就可以使用此型態宣告XML元素: 上述元素定義XML的ISBN元素,使用的資料型態就是上頁定義的ISBNType,則所呈現的資料舉例如下: ex:957-717-658-5 <element name=“ISBN” type=“ISBNType” minOccurs=“1” maxOccurs=“1”/>
complexType元素 如果XML元素擁有子元素,此時我們就需要使用complexType元素的子元素名稱和型態 <complexType name=“name” content=“elementOnly”> <element …/> </complexType> 上述的complexType元素的屬性參數說明如下: name屬性:此為資料型態的名稱。 content屬性:說明元素的內容為何,值elementOnly表示在宣告XML元素,值mixed表示宣告元素和屬性,值empty表示此為空元素。
complexType元素(續) <complexType name=“bookType” content=“elementOnly”> <element name=“code” type=“string”/> <element name=“title” type=“string”/> <element name=“authorlist” type=“authorlsitType”/> <element name=“price” type=“decimal”/> </complexType> 上述的complexType元素定義了bookType的內容,也就是子元素code、title、authorlist和price,其中authorlist也是另一個complexType元素。
complexType元素(續) <element name=“book” type=“bookType” minOccurs=“1” maxOccurs=“unbounded”/> 上述這個元素出現次數最少為1,最多為無限,使用的bookType是上頁所宣告的一個complexType元素所建立的名稱型態,所以book元素擁有子元素code、title、authorlist和price。。
complexType元素(續) complexType元素的語法除了屬性外,其本身還擁有一些指令的子元素,如下: 子元素 說明 sequence XML子元素需依順序出現 choice 可以是XML子元素的任一個或數個 group 將基本的XML子元素建立成為一個群組 element 宣告XML元素 attribute 宣告XML屬性
complexType元素(續) 我們也可以用另一種方式,直接在element元素使用complexType子元素定義XML元素的子元素和屬性,如下: <element name=“name”> <complexType> ….. </complexType> </element>
sequence順序元素 sequence元素可以宣告XML子元素出現的順序,例如:book元素的子元素依序為code、title、authorlist和price,如下: <complexType name=“bookType” content=“elementOnly”> <sequence> <element name=“code” type=“string”/> <element name=“title” type=“string”/> <element name=“authorlist” type=“authorlsitType”/> <element name=“price” type=“decimal”/> </sequence> </complexType>
choice選項元素 如果XML元素出現的次數允許選擇,也可能重覆出現,也可能不出現,choice可指定那些XML元素為選項元素: <element name=“a” type=“string minOccurs=“1” maxOccurs=“1”/> <element name=“b” type=“string” minOccurs=“1” maxOccurs=“1”/> <element name=“c” type=“stringl” minOccurs=“1” maxOccurs=“1”/> </choice> 上述指令為三選一,只能為a,b,c元素其中之一。
choice選項元素(續) 如果有需要重覆出現,choice需要指定屬性。如下: <choice minOccurs=“0” maxOccurs=“unbounded”> ………… </choice> 上述元素屬性minOccurs和maxOccurs指出choice元素下的XML元素允許出現無限次,也可以為零次。
empty空元素 如果XML元素為空元素,只需指定complexType元素的content屬性即可 <element name=“image” minOccurs=“1” maxOccurs=“1”> <complexType content=“empty”> <attribute name=“file” type=“string” use=“required”/> </complexType> </element> 上述元素image並沒有內容,只擁有屬性file,此時合法的元素如下: <image file=“f1234.gif”/>
group群組元素 對於XML文件一些基本的XML元素,我們可以將它們給合成為一個group元素,例如:code,title,authorlist和price元素。 <group name=“bookData”> <sequence> <element name=“code” type=“string”/> <element name=“title” type=“string”/> <element name=“authorlist” type=“authorlsitType”/> <element name=“price” type=“decimal”/> </sequence> </group>
group群組元素(續) 上述的group元素將code,title,authorlist和price建立成一個稱為bookData的群組,在建立好群組後,我們可以在宣告時直接使用此群組,下頁說明如何使用。
group群組元素(續) <complexType name=“bookType” content=“elementOnly”> <sequence> <group ref=“bookData” minOccurs=“1” maxOccurs=“1”/> <element name=“image” minOccurs=“1” maxOccurs=“1”> <complexType content=“empty”> <attribute name=“file” type=“string” use=“required”/> </complexType> </element> </sequence> 上述的group元素使用ref屬性指定使用的群組,並可以指定出現的次數,不過請注意group元素需在真的參考前宣告。
XML Schema屬性宣告 使用XML Schema宣告XML元素後,接下來就是宣告XML元素的屬性,基本上屬性的宣告方式有兩種,一種使用內建資料型態或simpleType元素的自訂資料型態,另一種是在宣告同時,使用simpleType元素宣告所需的資料型態。
XML元素屬性 如果XML元素擁有屬性,我們就需要在宣告complexType元素或element元素時,同時宣告元素的屬性,使用的就是attribute元素,其語法如下: <attribute name=“name” type=“simple_type” use=“how_its_used” value=“value”/>
XML元素屬性(續) 上頁attribute元素可以宣告XML元素的屬性,一個attribute元去宣告一個屬性,其屬性參數的說明如下: Name屬性:XML元素的屬性名稱。 Type屬性:屬性的資料型態,可以使用內建或simpleType元素定義的資料型態。 Use/value屬性:這兩個屬性擁有關連性,use屬性為XML屬之的使用方式,不同的使用方式擁有不同的value屬性值,詳細的說明,如下表所示。
XML元素屬性(續) Use屬性值 Value屬性值 說明 Optional N/A Required N/A或預設值 Default Fixed 屬性如果存在,其內容一定是value屬性值
complexType元素的屬性 當使用attribute元素宣告XML屬性,通常都屬於complexType元素的子元素,如果complexType元素同時宣告有元素和屬性,此時的content屬性值為mixed。 <complexType name=“bookType” content=“mixed”> <sequence> …. </sequence> <attribute name=“sales” use=“required” type=“boolean”/> </complexType>
complexType元素的屬性(續) 上頁的attribute元素宣告一個sales屬性required表示為必須的屬性,宣告的屬性屬於此complexType元素的element元素,也就是book元素,如下: <element name=“book” type=“bookType” minOccurs=“1” maxOccurs=“unbounded”/> 上述的element元素宣告一個XML元素book,這個元素擁有屬性sales。
Element元素的屬性 同樣的attribute也可以屬於element元素的子元素,例如XML元素book擁有屬性code,如下所示: <element name=“book” type=“string”> <attribute name=“code” type=“string” use=“required”/> </element> 上述指示使用element元素宣告一個XML元素book後,同時也使用attribute宣告此元素的屬性code。
宣告XML屬性同時宣告資料型態 如果屬性值不是使用內建的資料型態,此時我們可以在宣告屬性時,同時使用simpleType元素宣告屬性的資料型態。 <attribute name=“name” use=“how_its_used” value=“value”> <simpleType base=“simpleType”> …………. </simpleType> </attribute>
attributeGroup元素 如同宣告XML元素時使用group群組元素,XML屬性一樣也可以使用attributeGroup元素建立群組屬性,例如:將原來圖書資料的XML元素都改為屬性內容,如下 <attributeGroup name=“bookAttr”> <element name=“code” type=“string” use=“required”/> <element name=“title” type=“string” use=“required” /> <element name=“author” type=“string” use=“required” /> <element name=“price” type=“decimal” use=“required” /> </attributeGroup>
attributeGroup元素(續) 上頁群組屬性bookAttr宣告code,title, author和price屬性,接著可以在宣告XML元素book時,直接套用群組屬性,如下: <element name=“image” minOccurs=“1” maxOccurs=“1”> <complexType content=“empty”> <attributeGropu ref=“bookAttr”/> </complexType> </element>
attributeGroup元素(續) 上頁attributeGroup元素使用ref屬性參考群組屬性bookAttr,也就是說XML元素book將擁有群組屬性的所有屬性,如下: <book code=“F8931” title=“XML Schema探討” author=“JACK” price=“500”/>