XSDL(XML Schema定義語言)由元素、屬性、命名空間和XML文檔種的其他節點構成的。
一、XSD中的元素
XSD文檔至少要包含:schema根元素和XML模式命名空間的定義、元素定義。
1、schema根元素語法如下:
<xsd:schema xmlns:xsd=“http://www.w3.org/2001/XMLSchema”>
…
</xsd:schema>
在XSD中必須定義一個且只能定義一個schema根元素。根元素中包括模式的約束、XML模式命名空間的定義,其他命名空間的定義、版本信息、語言信息和其他一些屬性。
2、元素
語法如下:
<xsd:element name=”user” type=”xsd:string” />
XSD中的元素是利用element標識符來聲明的。其中name屬性是元素的名字,type屬性是元素值的類型,在這里可以是XML Schema中內置的數據類型或其他類型。
例子:
<xsd:schema xmlns:xsd=“http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”user” type=”xsd:string” />
</xsd:schema>
以上文檔對應的有效XML文檔如下:
<?xml version=”1.0”?>
<user>string</user>
在元素的定義中還有2個屬性:minOccurs和maxOccurs。其中minOccurs定義了該元素在父元素中出現的最少次數(默認為1,值為大于等于0的整數),maxOccurs定義了該元素在父元素中出現的最多次數(默認為1,值為大于等于0的整數)。在maxOccurs中可以把值設置為unbounded,表示對元素出現的最多次數沒有限制。
例子:
<xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchema>
<xsd:element name=”user” type=”xsd:string” minOccurs=”0” maxOccurs=”unbounded” />
</xsd:schema>
表示為元素user的類型為string,出現的次數最少為0(也就是可選),最多不限制。
3、引用元素和替代
語法如下:
<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”user” type=”xsd:string” />
<xsd:element name=”name”>
<xsd:complexType>
<xsd:sequence>
<xsd:element ref=”user” />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
引用是利用element標記符的ref屬性實現的。主要適用于避免在文檔中多次定義同一個元素,應當將經常使用的元素定義為根元素的子元素,以便在文檔的任何地方引用它。
在這里還可以為某個定義的元素起一個別名,方法如下:
<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”yonghu” type=”xsd:string” substitutionGroup=”user” />
<xsd:element name=”user” type=”xsd:string” />
<xsd:element name=”name”>
<xsd:complexType>
<xsd:sequence>
<xsd:element ref=”user” />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
以上文檔對應的有效XML文檔如下:
<?xml version=”1.0”?>
<name>
<user>string</user>
</name>
或者:
<?xml version=”1.0”?>
<name>
<yonghu>string</yonghu>
</name>
主要是利用element標識符中的屬性substitutionGroup實現的。
4、設置默認值和固定值
語法如下:
<xsd:element name=”city” type=”xsd:string” default=”xian” />
<xsd:element name=”country” type=”xsd:string” fixed=”china” />
通過default屬性的設置,可以在XML文檔中沒有對city元素定義時賦予默認值。而使用fixed屬性,可以給元素country設定一個固定的值china,并且不允許改變!
5、利用組合器控制結構
sequence組合器,定義了一列元素必須按照模式中指定的順序顯示(如果是可選的,也可以不顯示)。語法如下:
<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”name”>
<xsd:complexType>
<xsd:sequence>
<xsd:element name=”first” type=”xsd:string” />
<xsd:element name=”middle” type=”xsd:string” />
<xsd:element name=”last” type=”xsd:string” />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
all組合器,允許所定義的元素可以按照任意順序顯示,all元素的子元素在默認情況下是必須的,而且每次最多顯示一次。語法如下:
<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”name”>
<xsd:complexType>
<xsd:all minOccurs=”0”>
<xsd:element name=”first” type=”xsd:string” />
<xsd:element name=”middle” type=”xsd:string” />
<xsd:element name=”last” type=”xsd:string” />
</xsd:all>
</xsd:complexType>
</xsd:element>
</xsd:schema>
choice組合器,允許指定多組聲明中的一個,用于互斥情況。語法如下:
<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”name”>
<xsd:complexType>
<xsd:choice>
<xsd:element name=”first” type=”xsd:string” />
<xsd:element name=”middle” type=”xsd:string” />
<xsd:element name=”last” type=”xsd:string” />
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
二、定義屬性
在XML Schema文檔中可以按照定義元素的方法定義屬性,但受限制的程度較高。它們只能是簡單類型,只能包含文本,且沒有子屬性。可以應用在attribute元素定義中的屬性如下:
default 初始默認值
fixed 不能修改和覆蓋的屬性固定值
name 屬性的名稱
ref 對前一個屬性定義的引用
type 該屬性的XSD類型或者簡單類型
use 如何使用屬性
form 確定attributeFormDefault的本地值
id 模式文檔中屬性唯一的ID
Default、fixed、name、ref和type屬性與在element標記中定義的對應屬性相同,但type只能是簡單類型。Use屬性的值可以是:optional(屬性不是必須的,此為默認屬性)、prohibited或者required(屬性是強制的)。
1、創建屬性
語法如下:
<xsd:attribute name=”age” type=”xsd:integer” />
該語句定義了一個名為age的屬性,它的值必須是一個整數。把它添加到模式中時,它必須時schema元素、complexType元素或者attributeGroup元素的子元素。
例子:
<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”name”>
<xsd:complexType>
<xsd:sequence>
<xsd:element name=”first” type=”xsd:string” />
</xsd:sequence>
<xsd:attribute name=”age” type=”xsd:integer” use=”optional” />
</xsd:complexType>
</xsd:element>
</xsd:schema>
以上文檔對應有效的XML文檔如下:
<?xml version=”1.0”?>
<name age=”27”>
<first>string</first>
</name>
如上所示,要把屬性附加在元素上,屬性應該在complexType定義中的組合器之后定義或引用。
三、XML Schema數據類型
XML Schema提供了一組豐富的內置數據類型,用于定義元素中允許的類型。下面將介紹一些完全符合C#標準的通用類型。
1、基本數據類型
基本數據類型是在XML Schema中使用的每種數據類型的最基本構成塊。可以根據這些類型構造自定義的類型。這些類型包括:
boolean 可以是1(true)或者0(false)。
dateTime 表示時間的部分可選,格式:CCYY-MM-DDThh:mm:ss
例如:2005-3-18T14:48:12
decimal 表示任意精度的十進制數字。
string 字符數據。
int 表示從-2,147,483,648到2,147,483,648之間一個整數。
nonNegativeInteger 表示大于或者等于0的一個整數。
nonPositiveInteger 表示小于或者等于0的一個整數。
short 表示從-32768到32767之間的一個整數。
例如:
<xsd:schema xmlns:xsd=http://www.w3.org/2001/XMLSchema>
<xsd:element name=”ContactDetails”>
<xsd:complexType>
<xsd:sequence>
<xsd:element ref=”name” />
<xsd:element name=”rate” type=”xsd:decimal” />
</xsd:sequence>
<xsd:attribute name=”lastUpdated” type=”xsd:dateTime” />
</xsd:complexType>
</xsd:element>
<xsd:element name=”name”>
<xsd:complexType>
<xsd:sequence>
<xsd:element name=”first” type=”xsd:string” />
<xsd:element name=”middle” type=”xsd:string” />
<xsd:element name=”last” type=”xsd:string” />
</xsd:sequence>
<xsd:attribute name=”local” type=”xsd:boolean” />
</xsd:complexType>
</xsd:element>
</xsd:schema>
以上文檔對應有效的XML文檔如下:
<?xml version=”1.0”?>
<ContactDetails lastUpdated=” 2005-3-18T14:48:12”>
<name local=”true”>
<first>santld</first>
<middle/>
<last>wang</last>
</name>
<rate>10.27</rate>
</ContactDetails>
2、簡單類型
雖然從內置數據類型中得到了許多的功能,但是在許多情況下,只有數據類型來限制數據的值是遠遠不夠的。這里在學習簡單類型之前,先看看關于約束。
約束方面
enumeration 用空格分開的一組指定的數值。它把數據類型約束為指定的值。
fractionDigit 指定小數點后的最大位數。
length 長度單位。
minExclusive 下限值,所有的值都必須大于該值。
maxExclusive 上限值,所有的值都應該小于該值。
minLength 長度單位的最小個數。
maxLength 長度單位的最大數。
minInclusive 最小值,所有的值都應該大于或者等于該值。
maxInclusive 最大值,所有的值都應該小于或者等于該值。
pattern 數據類型的值必須匹配的指定模式,pattern值必須是一個正則表達式。
totalDigits 指定小數最大位數的值。
whiteSpace 其值為:preserve(值中的空格不能改變),replace(所有的制表
符、換行符和回車符都用空格代替),collapse(執行replace,刪
除相鄰的、結尾處和開頭處的空格)。
要應用上述的約束,就要利用元素restriction。這個元素中有2個屬性:id屬性是模式文檔中restriction元素的唯一標識符,base屬性設置為一個內置的XSD數據類型或者現有的簡單類型定義,他是一種被限制的類型。
例如:
<xsd:restriction base=”xsd:string”>
<xsd:minLength value=”4” />
<xsd:maxLength value=”10” />
</xsd:restriction>
如上,將字符串最小長度限定為4個字符,將最大長度限定為10個字符。
<xsd:restriction base=”xsd:int”>
<xsd:minInclusive value=”1” />
<xsd:maxInclusive value=”100” />
</xsd:restriction>
如上,將一個整數的取值范圍設置為1到100之間。
<xsd:restriction base=”xsd:string”>
<xsd:enumeration value=”FistValue” />
<xsd:enumeration value=”SecondValue” />
<xsd:enumeration value=”ThirdValue” />
</xsd:restriction>
如上,字符串只能為枚舉出的三種值。
簡單類型
簡單類型是對一個節點的可能值進一步限制的自定義數據類型。創建簡單類型需要利用simpleType元素,其定義如下:
<simpleType id=”ID” name=”NCName” final=”(#all|(list|union|restriction))” />
id屬性應唯一的標明文檔內的simpleType元素,name不能使用冒號字符。simpleType不能包含元素,也不能有屬性,根據在simpleType中定義的規則,它基本上是一個值,或者是一個值的集合。
例如:
<xsd:simpleType name=”personsName”>
<xsd:restriction base=”xsd:string”>
<xsd:minLength value=”4” />
<xsd:maxLength value=”8” />
</xsd:restriction>
</xsd:simpleType>
<xsd:element name=”first” type=”personsName” />
以上文檔對應有效的XML文檔如下:
<first>Santld</first>
以下就是無效的XML文檔:
<first>SS</first> 或者 <first>Santld wang</first>
再舉個例子:
<xsd:simpleType name=”personsTitle”>
<xsd:restriction base=”xsd:string”>
<xsd:enumeration value=”Mr.” />
<xsd:enumeration value=”Mrs.” />
<xsd:enumeration value=”Miss.” />
</xsd:restriction>
</xsd:simpleType>
<xsd:element name=”title” type=”personsTitle” />
上面定義的類型personsTitle是一個字符串類型,但它的值只能是Mr.、Mrs.或者Miss.其中的一個。
復雜類型
復雜類型的定義必須使用complexType元素,在這里可以包含屬性和元素。在復雜類型的使用中,主要是complexType和simpleType配合使用。格式如下:
<xsd:complexType name=”name” />
例如:
<xsd:element name="name" type="FullName" />
<xsd:complexType name="FullName">
<xsd:sequence>
<xsd:element name="first" type="PersonsFirstname" minOccurs="0" maxOccurs="1"
default="John" />
<xsd:element name="middle" type="xsd:string" minOccurs="0"
maxOccurs="unbounded" nillable="true" />
<xsd:element name="last" type="xsd:string" minOccurs="1" maxOccurs="1"
default="Doe" />
</xsd:sequence>
<xsd:attribute name="title" type="PersonsTitle" default="Mr." />
</xsd:complexType>
<xsd:simpleType name="PersonsFirstname">
<xsd:restriction base="xsd:string">
<xsd:minLength value="4" />
<xsd:maxLength value="10" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="PersonsTitle">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="Mr." />
<xsd:enumeration value="Mrs." />
<xsd:enumeration value="Miss." />
</xsd:restriction>
</xsd:simpleType>
如上就實現了一個復雜類型,該例子實現了一個復雜類型FullName,其中包含了兩個簡單類型PersonsFirstname和PersonsTitle。
分組和屬性
在為定義XML文檔而創建的一些更為復雜的定義中,會有一些元素集、屬性集的組合,這是我們就使用了分組的概念。分組定義中使用的是group元素。
例如:
<xsd:group name=”CityChoice”>
<xsd:choice>
<xsd:element name=”
<xsd:element name=”
<xsd:element name=”Xian” type=”xsd:string” />
</xsd:choice>
</xsd:group>
<xsd:element name=”City”>
<xsd”group ref=”CityChoice” minOccurs=”1” maxOccurs=”1” />
</xsd:element>
對屬性的分組,應該使用attributeGroup元素,例如:
<xsd:attributeGroup name=”contactAttribs”>
<xsd:attribute name=”city” type=”xsd:string” />
<xsd:attribute name=”country” type=”xsd:string” />
<xsd:attribute name=”age” type=”xsd:string” />
</xsd:attributeGroup>
<xsd:element name=”contact”>
<xsd:complexType>
<xsd:attributeGroup ref=”contactAttribs” />
</xsd:complexType>
</xsd:element>
以上文檔對應有效的XML文檔如下:
<contact city=”
內容模型可以對在XML文檔內使用的元素、屬性和類型進行限制,確定用戶可以在XML實例的哪些等級添加自己的元素和屬性。
any
當在XML中聲明元素時any是默認的內容模型,該模型可以包含文本、元素和空格。如果允許添加元素的內容,且無需屋里修改模式文件,就可以使用該模型。
例如:
<xsd:xchema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”name”>
<xsd:complexType>
<xsd:sequence>
<xsd:element name=”first” type=”xsd:string” />
<xsd:element name=”middle” type=”OtherNames” />
<xsd:element name=”last” type=”xsd:string” />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name=”OtherNames”>
<xsd:sequence>
<xsd:any namespace=”##any” processContents=”lax” minOccurs=”0”
maxOccurs=”unbounded” />
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
##any(元素可以來自任何命名空間)
##other(元素可以來自除了該元素的父元素所在的目標命名空間之外的命名空間)
##local(元素不受命名空間的限制)
##targetNamespace(元素來自父元素的目標命名空間)
processContents屬性說明對這里所創建的元素進行驗證時所執行的操作,取值有如下3種:
strict(標明XML處理器必須獲得和那些命名空間相關聯的模式,并驗證元素和屬性)
lax(與strict相似,只是如果處理器找不到模式文檔,也不會出現錯誤)
skip(不利用模式文檔驗證XML文檔)
上述模式的一個有效實例如下:
<name>
<first>santld</first>
<middle>
<nameInChina>San</nameInChina>
</middle>
<last>wang</last>
</name>
empty
empty元素禁止把文本或者元素作為一個聲明為空的元素的子元素,如果要保證該元素不包括子元素、文本甚至空格,就可以使用它。在XSD中時利用xsd:anyType類型來限定它的,這樣就意味元素只能包含屬性,例如:
<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”contact”>
<xsd:complexType>
<xsd:complexContent>
<xsd:restriction base=”xsd:anyType”>
<xsd:attribute name=”age” type=”xsd:integer” />
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
以上就是一個復雜類型,只允許有一個age屬性。在例子里complexContent元素可以表示complexType的內容要進行擴充或者限制,在這里,我們對其內容進行限制,因此使用了restriction元素,如果擴成則使用exension元素。
element(前邊已經了解過了)
mixed
最后一個內容模型就是mixed,它包含文本、內容和屬性。在complexType元素上把mixed屬性的值設為true,就一個聲明一個mixed內容模型了。例如:
<xsd:schema xmlns:xsd=”http://www.w3.org/2001/XMLSchema”>
<xsd:element name=”contact”>
<xsd:complexType mixed=”true”>
<xsd:sequence>
<xsd:element name=”first” type=”xsd:string” />
</xsd:sequence>
<xsd:complexType>
</xsd:element>
</xsd:schema>
上述模式的一個有效實例如下:
<?xml version=”1.0”?>
<contact>My first name is<first>Santld</first>.</contact>
在例子中contact元素就包含了文本和元素first。