跟我學XML?Schema(9):自定義簡單類型
如果內置簡單類型的44種還不能滿足要求,怎么辦呢?下面學習自定義簡單類型。(XML的擴展性充分體現在這里)
例如這個實例文檔:
order4.xml
-----------------
<order>
??<orderItem>
????<id>7-5058-3496-7</id>
????<quantity>5</quantity>
??</orderItem>
</order>
ID是一個標準的ISBN編碼,我們怎么定義這個ISBN編碼呢?
<xsd:simpleType?name="idType">
??<xsd:restriction?base="xsd:string">
????<xsd:pattern?value="\d{1}-\d{4}-\d{4}-\d{1}"/>
??</xsd:restriction>
</xsd:simpleType>
idType是一個自定義的簡單類型。
我們對它做了限制:
<xsd:restriction?base="xsd:string">代表它是基于一個字符串類型。再用pattern元素來描述該字符串的形式。
value="\d{1}-\d{4}-\d{4}-\d{1}"這是一個正則表達式,關于正則表達式,以后再介紹。嘻嘻!
利用這個自定義的簡單類型,我們可以重新寫Schema文檔:
order4.xsd
---------------
1:<?xml?version="1.0"?>
2:<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3:
4:??<xsd:element?name="order">
5:????<xsd:complexType>
6:??????<xsd:sequence>
7:????????<xsd:element?ref="orderItem"?maxOccurs="10"/>
8:??????</xsd:sequence>
9:????</xsd:complexType>
10:??</xsd:element>
11:
12:??<xsd:element?name="orderItem">
13:????<xsd:complexType>
14:??????<xsd:sequence>
15:????????<xsd:element?name="id"?type="idType"/>
16:????????<xsd:element?name="quantity"?type="xsd:integer"/>
17:??????</xsd:sequence>
18:????</xsd:complexType>
19:??</xsd:element>
20:??
21:??<xsd:simpleType?name="idType">
22:????<xsd:restriction?base="xsd:string">
23:??????<xsd:pattern?value="\d{1}-\d{4}-\d{4}-\d{1}"/>
24:????</xsd:restriction>
25:??</xsd:simpleType>
26:??
27:</xsd:schema>
假如我們事先確定好ID只有3個,即只有3個ISBN是可選的,那怎么辦?我們可以用enumeration元素來進行列舉。
<xsd:simpleType?name="idType">
??<xsd:restriction?base="xsd:string">
????<xsd:enumeration?value="7-5058-3496-7"/>
????<xsd:enumeration?value="7-5005-6450-3"/>
????<xsd:enumeration?value="7-3020-6069-7"/>
??</xsd:restriction>
</xsd:simpleType>
再來看訂購量quantity的值,如果我們設定其值必須在1-10之間,該怎么辦呢?可以這些自定義一個簡單類型。
<xsd:simpleType?name="quantityType">
??<xsd:restriction?base="xsd:integer">
????<xsd:minInclusive?value="1"/>
????<xsd:maxInclusive?value="10"/>
??</xsd:restriction>
</xsd:simpleType>
其中,minInclusive,maxInclusive分別代表該類型的取值范圍。
所以最終修改后的Schema文檔如下:
order4-1.xsd
----------------------
1:<?xml?version="1.0"?>
2:<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3:
4:??<xsd:element?name="order">
5:????<xsd:complexType>
6:??????<xsd:sequence>
7:????????<xsd:element?ref="orderItem"?maxOccurs="10"/>
8:??????</xsd:sequence>
9:????</xsd:complexType>
10:??</xsd:element>
11:
12:??<xsd:element?name="orderItem">
13:????<xsd:complexType>
14:??????<xsd:sequence>
15:????????<xsd:element?name="id"?type="idType"/>
16:????????<xsd:element?name="quantity"?type="quantityType"/>
17:??????</xsd:sequence>
18:????</xsd:complexType>
19:??</xsd:element>
20:??
21:??<xsd:simpleType?name="idType">
22:????<xsd:restriction?base="xsd:string">
23:??????<xsd:enumeration?value="7-5058-3496-7"/>
????<xsd:enumeration?value="7-5005-6450-3"/>
????<xsd:enumeration?value="7-3020-6069-7"/>
26:????</xsd:restriction>
27:??</xsd:simpleType>
28:??
29:??<xsd:simpleType?name="quantityType">
30:????<xsd:restriction?base="xsd:integer">
31:??????<xsd:minInclusive?value="1"/>
32:??????<xsd:maxInclusive?value="10"/>
33:????</xsd:restriction>
34:??</xsd:simpleType>
35:
36:</xsd:schema>
跟我學XML?Schema(10):定義屬性
最后,我們再來講講元素的屬性如何在Schema文檔中定義。
比如上面的order.xml實例文檔中:
<order>
??<orderItem?id="7-5058-3496-7"?/>
</order>
對此,我們在Schema文檔中采用一個attribute來定義:
order.xsd
---------
<xsd:element?name="orderItem">
??<xsd:complexType>
????<xsd:sequence> ←空元素
????</xsd:sequence> ?
????
????<!--定義該元素屬性-->
????<xsd:attribute?name="id"?type="xsd:string"/>
??</xsd:complexType>
</xsd:element>
那么,實例文檔中該屬性值是必須的還是可有可無的呢?我們可以這樣限制:
<xsd:attribute?name="id"?type="idType"?use="required"/>
這里我們講id屬性類型作為一種自定義數據類型idType。
而且,用attribute元素的use屬性來定義是否是必須的屬性。
required是必須值,optional是可選值,prohibited是無屬性值。
那么對于屬性的缺省值,我們怎么定義呢?
比如:
<order>
??<orderItem?id="4-8443-1780-6"?quantity="3"/>
</order>
我們還可以用attribute元素的另一個屬性default來定義:
<xsd:attribute?name="quantity"?type="xsd:integer"?default="1"/>
所以,我們可以重新寫出一個Schema文檔:
order2.xsd
--------------
<xsd:element?name="orderItem">
??<xsd:complexType>
????<xsd:sequence></xsd:sequence>
????<xsd:attribute?name="id"?type="idType"?use="required"/>
????<xsd:attribute?name="quantity"?type="xsd:integer"?default="1"/>
??</xsd:complexType>
</xsd:element>
上面的屬性我們定義我們還可以采用屬性組的辦法來重新改寫Schema文檔。
order3.xsd
----------------
1:????<xsd:element?name="orderItem">
2:??????<xsd:complexType>
3:????????<xsd:sequence></xsd:sequence>
4:????????<xsd:attributeGroup?ref="orderItemAttributes"/>
5:??????</xsd:complexType>
6:????</xsd:element>
7:
8:????<xsd:attributeGroup?name="orderItemAttributes">
9:??????<xsd:attribute?name="id"?type="idType"?use="required"/>
10:??????<xsd:attribute?name="quantity"?type="xsd:integer"?default="1"/>
11:????</xsd:attributeGroup>
這個屬性組就不詳細解釋了,不過,大家一看就清楚了吧。
最后,我們寫一個完整的訂書order.xml的Schema文檔。
1:??<?xml?version="1.0"?>
2:??<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3:
4:????<xsd:element?name="order">
5:??????<xsd:complexType>
6:????????<xsd:sequence>
7:??????????<xsd:element?ref="orderItem"?maxOccurs="10"/>
8:????????</xsd:sequence>
9:??????</xsd:complexType>
10:????</xsd:element>
11:
12:????<xsd:element?name="orderItem">
13:??????<xsd:complexType>
14:????????<xsd:sequence></xsd:sequence>
15:????????<xsd:attributeGroup?ref="orderItemAttributes"/>
16:??????</xsd:complexType>
17:????</xsd:element>
18:
19:????<xsd:attributeGroup?name="orderItemAttributes">
20:??????<xsd:attribute?name="id"?type="idType"?use="required"/>
21:??????<xsd:attribute?name="quantity"?type="xsd:integer"?default="1"/>
22:????</xsd:attributeGroup>
23:
24:????<xsd:simpleType?name="idType">
25:??????<xsd:restriction?base="xsd:string">
26:????????<xsd:pattern?value="\d{1}-\d{4}-\d{4}-\d{1}"/>
27:??????</xsd:restriction>
28:????</xsd:simpleType>
29:
30:??</xsd:schema>