Schema
Schema簡介
本章我們將用XML Schema文件對學生信息的XML文檔進行約束,并加入老師的信息。實現了如下的功能:
對每個“學生”元素都用一個編號屬性唯一標識。且編號的值要類似“B001”,即第一個字符為大寫字母,后面跟三個數字。約束“電子郵箱”為“ewsd@163.com”的形式。“老師”元素用一個編號屬性唯一標識。且編號的值要類似“GB001”。
Schema文件的部分內容如下:
對“年齡”元素和“身高”元素的值進行限制。即年齡必須是在26到18歲之間。身高必須在140.0cm到190.0cm之間。 代碼如下:
<xs:simpleType name="age">
<xs:restriction base="xs:int">
<xs:maxExclusive value="26"></xs:maxExclusive>
<xs:minExclusive value="18"></xs:minExclusive>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="length">
<xs:restriction base="xs:float">
<xs:maxExclusive value="190.0"></xs:maxExclusive>
<xs:minExclusive value="140.0"></xs:minExclusive>
</xs:restriction>
</xs:simpleType>
Schema的誕生
XML在某些特殊的應用場合,對數據本身、數據的類型以及數據之間的聯系都有一定的限制。這種限制不是由XML語法來規定的,而是在特殊的環境中所必須的一種限制。我們需要把這種限制用另外的方式表達出來,然后告訴用戶和計算機。
Schema作為一種新的思想誕生了,Schema通常是一組為了描述某一類XML文檔而定義好的一套規則。XML Schema與DTD一樣,也是對某一類XML文檔進行約束并確定其結構,包括對元素、屬性、及數據類型的完整定義,及某個XML文檔中所使用的元素、實體、元素的屬性、元素與實體之間的關系的特殊約束。XML Schema最初是由微軟提出并使用,后來在W3C的專家們充分討論和論證的基礎上,于1999年2月15日,W3C發布了一個需求定義,說明了新定義的Schema必須符合的要求。1999年5月6日,W3C完成并發布了Schema的定義。最終被確定成為一個標準。
Schema的優勢
XML Schema文件使用XML語法,在其設計目的方面與DTD類似,但是在功能方面,XML Schema比DTD更完善,并且更容易擴展。相比DTD主要優勢有以下幾點:
(1)一個XML Schema文件同時也是一個XML文檔,
(2)Schema定義了多種數據類型。在XML Schema文件中可以像在其他編程語言那樣來定義數據類型,如整型、字符型、浮點型、布爾型、日期型等。
Schema的建立和使用
建立有效的Schema文件
一個有效的Schema文件的結構如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 這里編寫內容 -->
</xs:schema>
使用Xmlspy工具書寫Schema
首先啟動Xmlspy 2006企業版,然后點擊菜單欄中的“文件”“新建”菜單項,打開“創建新文檔”對話框,選擇“xsd XML Schema file”文檔類型,如下圖:
點擊“確定”按鈕,進入文檔編輯區,如下圖:
內容編輯完成后,點擊如圖所示的工具欄中帶黃色對勾()的按鈕驗證文件格式,如果格式良好,將顯示帶黃色對勾()的標記;反之,將顯示帶紅色叉(X)的標記。點擊圖3-2所示的工具欄中帶綠色對勾()的按鈕驗證文件有效性,如果文件有效,將顯示帶綠色對勾()的標記;反之,將顯示帶紅色叉(X)的標記。
Schema簡單類型元素
Schema類型的元素是Schema文件的根元素,每個Schema文件必須包含Schema類型的元素。Schema類型元素的屬性有以下幾種:
簡單類型元素主要有: simpleType類型元素 element類型元素 attribute類型元素 enumeration類型元素 pattern類型元素 union類型元素 list類型元素
simpleType類型元素
simpleType類型用于定義一個簡單類型的元素。
simpleType類型的屬性有“final”、“id”和“name”。“final”屬性指出派生的類型,防止該simpleType元素的指定派生類型,該值可以包含一個列表,該列表是list、union或restriction元素的子集。如下:
<xs:simpleType> <xs:restriction base="xs:positiveInteger">
<!-- 限制取值范圍 --> <xs:maxExclusive value="100"/>
</xs:restriction>
</xs:simpleType>
xs:restriction :限制基類型元素
element類型元素
element用于定義一個普通的元素。一般格式如下:
<element name="name" type="string"></element>
<element name="age" type="int"></element>
<element name="address" type="string"></element>
element元素的屬性有name、abstract、block、default、final、fixed、id、nillable、maxOccurs、minOccurs、substitutionGroup和type
name屬性的值是該element元素的元素名。
type屬性的值是該element元素的數據類型
ref屬性的值必須指向一個全局元素。
maxOccurs屬性的值是元素在其父元素中出現的最大次數,它的取值為大于0或等于0的數,在默認狀態下為unbounded
minOccurs屬性的值是元素在其父元素中出現的最小次數,它的取值為大于0或等于0的數,在默認狀態下為1
attribute類型元素
attribute用于聲明一個屬性元素。如:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xs:attribute name="a"></xs:attribute>
</xs:schema>
attribute主要有name、default、fixed、id、 ref、type、use幾種屬性
(1)Default:指該attribute類型元素的名稱具有默認值;
(2)fixed:指該attribute類型元素的名稱具有固定的值 ;
(3)use:指示如何使用該attribute類型元素。use屬性的值必須是“optional”、“prohibited”、“required”中的一種。“optional”表示該屬性可以是任何值,并且該屬性是可選的;“prohibited”表示不能使用該屬性;“required”表示該屬性必須出現一次。在默認狀態下use的值是“optional”。
enumeration類型元素
enumeration類型用于顯示某個元素或屬性的枚舉。enumeration類型元素的屬性有“id”和“value”,id屬性標識該值在枚舉列表中的位置,value表示該enumeration類型元素的值。如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:attribute name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="北京"/>
<xs:enumeration value="上海"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:schema>
pattern類型元素
pattern類型主要用于對某個屬性或元素的值進行約束,pattern類型的屬性有“id”和“value”。“value”屬性的值是被約束元素或屬性的值的形式。如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="id" type="mytype">
</xs:element>
<xs:simpleType name="mytype">
<xs:restriction base="xs:string">
<xs:pattern value="\d{3}-[A-Z]{2}"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
union和list類型元素
list類型定義單個simpleType類型元素,而union類型定義多個simpleType類型元素。
list類型有“id”和“itemType”屬性。
“itemType”屬性是指在該元素中定義的內置數據類型或 simpleType元素的名稱。包含list元素的simpleType元素是從“itemType”值指定的簡單類型派生的。list值必須是限定名。對simpleType元素子級和“itemType”屬性的使用是互相排斥的。
union類型有“id”和“memberTypes”屬性。
“memberTypes”屬性是指在該元素中定義的內置數據類型或simpleType元素的名稱列表。包含union元素的simpleType元素是從“memberTypes”值指定的簡單類型派生的。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:attribute name="id">
<xs:simpleType>
<xs:union memberTypes="first second" />
</xs:simpleType>
</xs:attribute>
<!-- 第一個simpleType -->
<xs:simpleType name="first">
<xs:list itemType="second"></xs:list>
</xs:simpleType>
<!-- 第二個simpleType -->
<xs:simpleType name="second">
<xs:restriction base="xs:string">
<xs:enumeration value="b001"/>
<xs:enumeration value="b002"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>
Schema復雜類型元素
復雜類型是可以包含其他元素、屬性和組的元素定義。 主要有以下幾種:
sequence類型元素
complexType類型元素
choice類型元素
simpleContent類型元素
extension和restriction類型元素
group類型元素
attributeGroup類型元素
Schema的數據類型
簡單數據類型
Schema定義了多種內置數據類型。我們在編寫Schema文件時可以直接使用他們。內置數據類型又分為基本數據類型和派生數據類型。如下表所示:
簡單數據類型
Schema定義了多種內置數據類型。我們在編寫Schema文件時可以直接使用他們。內置數據類型又分為基本數據類型和派生數據類型。如下表所示:
string 表示字符串
boolean 表示布爾值
decimal 表示任意精度數字
float 表示單精度32位浮點數字
double 表示雙精度64位浮點數字
duration 表示持續時間。duration的模式為PnYnMnDTnHnMnS
dateTime 表示時間的特定實例。模式是CCYY-MM-DDThh:mm:ss
time 表示每天重復的時間的實例,模式為hh:mm:ss.sss
date 表示日歷日期。模式為CCYY-MM-DD
gYearMonth 表示特定公歷年中的特定公歷月
gYear 表示公歷年
gDay 表示重復的公歷日
gM onth 表示每年重復的公歷月
hexBinary 表示任意十六進制編碼的二進制數據
base64Binary 表示Base64編碼的任意二進制數據
anyURI 表示按RFC 2396定義的URI
QName 表示限定名
NOTATION 表示NOTATION屬性類型,QNames的集合
派生數據類型
由基本數據類型派生出來的數據類型有如下幾種:
ID:用于唯一標識元素
IDREF:IDREF類型的含義和使用與DTD中的類似。
IDREFS:IDREFS類型的含義和使用與DTD中的類似。
ENTITY:實體類型,與DTD中的類似。
ENTITIES:ENTITIES類型的含義和使用與DTD中的類似。
NMTOKEN:NMTOKEN類型,與DTD中的類似。
NMTOKENS:NMTOKENS類型集,與DTD中的類似。
long:表示長整型數大小在-9223372036854775808和9223372036854775807之間
int:表示整型數,大小在-2147483648和2147483647之間。
short:表示短整型數,大小在-32768和32767之間。
byte:表示整型數,大小在-128和127之間。
數據類型的屬性
每種數據類型都有不同的屬性,數據類型的屬性主要包括以下幾種:
enumeration:在指定的數據項中選擇,限定用戶的選值。
fractionDigits:限定最大的小數位,用于控制精度。
length:指定數據的長度。
maxExclusive:指定數據的最大值,不包含該最大值。
maxInclusive:指定數據的最大值,包含該最大值。
maxLength:指定長度的最大值,長度單位取決于數據類型。
minExclusive:指定最小值,不包含該最小值。該值的數據類型必須與繼承的數據類型相同。
minInclusive:指定最小值,包含該最小值。
minLength:指定最小長度。
pattern:指定數據的顯示規范。
用戶自定義數據類型
用戶在對數據類型進行自定義時,主要是通過simpleType定義,并通過simpleType元素的name屬性值作為該自定義數據類型的名稱。如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<!-- 自定義類型mytype -->
<xs:simpleType name="mytype">
<xs:restriction base="xs:string">
<xs:enumeration value="男"></xs:enumeration>
<xs:enumeration value="女"></xs:enumeration>
</xs:restriction>
</xs:simpleType>
<!-- 使用自定義類型mytype -->
<xs:element name="name" type="mytype"/>
</xs:schema>
復雜數據類型
復雜數據類型的定義主要是通過complexType定義。并通過complexType元素的name屬性值作為該自定義數據類型的名稱。如下:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="student">
<xs:complexType>
<xs:sequence>
<xs:element name="address" type="mytype" >
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- 用complexType定義一個復雜數據類型mytype-->
<xs:complexType name="mytype">
<xs:sequence>
<xs:element name="北京" type="xs:string"/>
<xs:element name="上海" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
用Schema約束XML文檔
使用schema合理控制元素之間的關系
元素與元素之間存在著父子關系、包含關系、繼承關系等,我們可以通過Schema中定義的各種類型元素來描述元素之間的關系。例如我們可以用complexType和sequence類型來描述父子關系、包含關系,用group類型來描述兄弟關系等。如下:
<!-- “Items”和“item”元素之間存在父子關系 -->
<xs:complexType name="Items">
<xs:sequence>
<xs:element name="item" minOccurs="0"
maxOccurs="unbounded">
<!--“item”和“productName”元素之間存在父子關系-->
<xs:complexType>
<xs:sequence>
<xs:element name="productName" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
使用schema文件對XML文檔約束
在XML文檔中使用已經編寫好的schema文件的一般格式如下:
<class xmlns="http://tempuri.org/po.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/po.xsd test.xsd">
</class>
“class”表示根元素,其中xmlns:xsi是在文檔中聲明“XML 模式實例”名稱空間,以授予對引用XML模式時需要的屬性的訪問權。當然,要添加前綴映射(xsi)和相關URL。xmlns是為所有沒有前綴的元素提供缺省命名空間。
同時我們可以通過設置schemaLocation屬性的值,讓該文檔應用多個schema文件。schemaLocation 屬性如下:
<xsi:schemaLocation="http://tempuri.org/po.xsd D:\XML\Schema\test1.xsd
D:\XML\Schema\test2.xsd">
實踐項目——<編寫班級信息XML文檔的XML Schema文件 >
程序的實現要求如下:
(1)使用Schema的內置數據類型和自定義數據類型來約束元素或屬性的值。
(2)使用Schema簡單類型元素和復雜類型元素來定義元素,以及描述個元素之間的關系。
評論
查看更多