三、XML Schema數(shù)據(jù)類型
XML Schema提供了一組豐富的內(nèi)置數(shù)據(jù)類型,用于定義元素中允許的類型。下面將介紹一些完全符合C#標(biāo)準(zhǔn)的通用類型。
1、基本數(shù)據(jù)類型
基本數(shù)據(jù)類型是在XML Schema中使用的每種數(shù)據(jù)類型的最基本構(gòu)成塊??梢愿鶕?jù)這些類型構(gòu)造自定義的類型。這些類型包括:
boolean 可以是1(true)或者0(false)。
dateTime 表示時間的部分可選,格式:CCYY-MM-DDThh:mm:ss
例如:2005-3-18T14:48:12
decimal 表示任意精度的十進(jìn)制數(shù)字。
string 字符數(shù)據(jù)。
int 表示從-2,147,483,648到2,147,483,648之間一個整數(shù)。
nonNegativeInteger 表示大于或者等于0的一個整數(shù)。
nonPositiveInteger 表示小于或者等于0的一個整數(shù)。
short 表示從-32768到32767之間的一個整數(shù)。
例如:
<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>
以上文檔對應(yīng)有效的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、簡單類型
雖然從內(nèi)置數(shù)據(jù)類型中得到了許多的功能,但是在許多情況下,只有數(shù)據(jù)類型來限制數(shù)據(jù)的值是遠(yuǎn)遠(yuǎn)不夠的。這里在學(xué)習(xí)簡單類型之前,先看看關(guān)于約束。
約束方面
enumeration 用空格分開的一組指定的數(shù)值。它把數(shù)據(jù)類型約束為指定的值。
fractionDigit 指定小數(shù)點(diǎn)后的最大位數(shù)。
length 長度單位。
minExclusive 下限值,所有的值都必須大于該值。
maxExclusive 上限值,所有的值都應(yīng)該小于該值。
minLength 長度單位的最小個數(shù)。
maxLength 長度單位的最大數(shù)。
minInclusive 最小值,所有的值都應(yīng)該大于或者等于該值。
maxInclusive 最大值,所有的值都應(yīng)該小于或者等于該值。
pattern 數(shù)據(jù)類型的值必須匹配的指定模式,pattern值必須是一個正則表達(dá)式。
totalDigits 指定小數(shù)最大位數(shù)的值。
whiteSpace 其值為:preserve(值中的空格不能改變),replace(所有的制表
符、換行符和回車符都用空格代替),collapse(執(zhí)行replace,刪
除相鄰的、結(jié)尾處和開頭處的空格)。
要應(yīng)用上述的約束,就要利用元素restriction。這個元素中有2個屬性:id屬性是模式文檔中restriction元素的唯一標(biāo)識符,base屬性設(shè)置為一個內(nèi)置的XSD數(shù)據(jù)類型或者現(xiàn)有的簡單類型定義,他是一種被限制的類型。
例如:
<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>
如上,將一個整數(shù)的取值范圍設(shè)置為1到100之間。
<xsd:restriction base=”xsd:string”>
<xsd:enumeration value=”FistValue” />
<xsd:enumeration value=”SecondValue” />
<xsd:enumeration value=”ThirdValue” />
</xsd:restriction>
如上,字符串只能為枚舉出的三種值。
簡單類型
簡單類型是對一個節(jié)點(diǎn)的可能值進(jìn)一步限制的自定義數(shù)據(jù)類型。創(chuàng)建簡單類型需要利用simpleType元素,其定義如下:
<simpleType id=”ID” name=”NCName” final=”(#all|(list|union|restriction))” />
id屬性應(yīng)唯一的標(biāo)明文檔內(nèi)的simpleType元素,name不能使用冒號字符。simpleType不能包含元素,也不能有屬性,根據(jù)在simpleType中定義的規(guī)則,它基本上是一個值,或者是一個值的集合。
例如:
<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” />
以上文檔對應(yīng)有效的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.或者M(jìn)iss.其中的一個。
復(fù)雜類型
復(fù)雜類型的定義必須使用complexType元素,在這里可以包含屬性和元素。在復(fù)雜類型的使用中,主要是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>
如上就實(shí)現(xiàn)了一個復(fù)雜類型,該例子實(shí)現(xiàn)了一個復(fù)雜類型FullName,其中包含了兩個簡單類型PersonsFirstname和PersonsTitle。
分組和屬性
在為定義XML文檔而創(chuàng)建的一些更為復(fù)雜的定義中,會有一些元素集、屬性集的組合,這是我們就使用了分組的概念。分組定義中使用的是group元素。
例如:
<xsd:group name=”CityChoice”>
<xsd:choice>
<xsd:element name=”Beijing” type=”xsd:string” />
<xsd:element name=”Shanghai” type=”xsd:string” />
<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>
對屬性的分組,應(yīng)該使用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>
以上文檔對應(yīng)有效的XML文檔如下:
<contact city=”Beijing” country=”China” age=”25” />
內(nèi)容模型
內(nèi)容模型可以對在XML文檔內(nèi)使用的元素、屬性和類型進(jìn)行限制,確定用戶可以在XML實(shí)例的哪些等級添加自己的元素和屬性。
any
當(dāng)在XML中聲明元素時any是默認(rèn)的內(nèi)容模型,該模型可以包含文本、元素和空格。如果允許添加元素的內(nèi)容,且無需屋里修改模式文件,就可以使用該模型。
例如:
<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>
例子中的xsd:any元素說明該類型允許添加內(nèi)容。namespace屬性允許的值為:
##any(元素可以來自任何命名空間)
##other(元素可以來自除了該元素的父元素所在的目標(biāo)命名空間之外的命名空間)
##local(元素不受命名空間的限制)
##targetNamespace(元素來自父元素的目標(biāo)命名空間)
processContents屬性說明對這里所創(chuàng)建的元素進(jìn)行驗(yàn)證時所執(zhí)行的操作,取值有如下3種:
strict(標(biāo)明XML處理器必須獲得和那些命名空間相關(guān)聯(lián)的模式,并驗(yàn)證元素和屬性)
lax(與strict相似,只是如果處理器找不到模式文檔,也不會出現(xiàn)錯誤)
skip(不利用模式文檔驗(yàn)證XML文檔)
上述模式的一個有效實(shí)例如下:
<?xml version=”1.0”?>
<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>
以上就是一個復(fù)雜類型,只允許有一個age屬性。在例子里complexContent元素可以表示complexType的內(nèi)容要進(jìn)行擴(kuò)充或者限制,在這里,我們對其內(nèi)容進(jìn)行限制,因此使用了restriction元素,如果擴(kuò)成則使用exension元素。
element(前邊已經(jīng)了解過了)
mixed
最后一個內(nèi)容模型就是mixed,它包含文本、內(nèi)容和屬性。在complexType元素上把mixed屬性的值設(shè)為true,就一個聲明一個mixed內(nèi)容模型了。例如:
<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>
上述模式的一個有效實(shí)例如下:
<?xml version=”1.0”?>
<contact>My first name is<first>Santld</first>.</contact>
在例子中contact元素就包含了文本和元素first。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報(bào)。