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=”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>
對屬性的分組,應該使用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=”Beijing” country=”China” age=”25” />
內容模型
內容模型可以對在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>
例子中的xsd:any元素說明該類型允許添加內容。namespace屬性允許的值為:
##any(元素可以來自任何命名空間)
##other(元素可以來自除了該元素的父元素所在的目標命名空間之外的命名空間)
##local(元素不受命名空間的限制)
##targetNamespace(元素來自父元素的目標命名空間)
>
processContents屬性說明對這裡所創建的元素進行驗證時所執行的操作,取值有如下3種:
strict(標明XML處理器必須獲得和那些命名空間相關聯的模式,並驗證元素和屬性)
lax(與strict相似,只是如果處理器找不到模式文檔,也不會出現錯誤)
skip(不利用模式文檔驗證XML文檔)
上述模式的一個有效實例如下:
<?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>
以上就是一個復雜類型,只允許有一個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。
(完)