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