天天看點

XML Schema - 應用程式中讀取和建立XSD - (二) XSD強大的資料類型之簡單類型

[i][b]XSD 簡易元素[/b][/i]

XML Schema 可定義 XML 檔案的元素。

簡易元素指那些隻包含文本的元素。它不會包含任何其他的元素或屬性。

什麼是簡易元素?

簡易元素指那些僅包含文本的元素。它不會包含任何其他的元素或屬性。

不過,“僅包含文本”這個限定卻很容易造成誤解。文本有很多類型。它可以是 XML Schema 定義中包括的類型中的一種(布爾、字元串、資料等等),或者它也可以是您自行定義的定制類型。

您也可向資料類型添加限定(即 facets),以此來限制它的内容,或者您可以要求資料比對某種特定的模式。

定義簡易元素

定義簡易元素的文法:

<xs:element name="xxx" type="yyy"/>

此處 xxx 指元素的名稱,yyy 指元素的資料類型。XML Schema 擁有很多内建的資料類型。

最常用的類型是:

xs:string

xs:decimal

xs:integer

xs:boolean

xs:date

xs:time

例子:

這是一些 XML 元素:

<lastname>Smith</lastname>

<age>28</age>

<dateborn>1980-03-27</dateborn>

這是相應的簡易元素定義:

<xs:element name="lastname" type="xs:string"/>

<xs:element name="age" type="xs:integer"/>

<xs:element name="dateborn" type="xs:date"/>

簡易元素的預設值和固定值

簡易元素可擁有指定的預設值或固定值。

當沒有其他的值被規定時,預設值就會自動配置設定給元素。

在下面的例子中,預設值是 "red":

<xs:element name="color" type="xs:string" default="red"/>

固定值同樣會自動配置設定給元素,并且您無法規定另外一個值。

在下面的例子中,固定值是 "red":

<xs:element name="color" type="xs:string" fixed="red"/>

[i][b]XSD 屬性[/b][/i]

所有的屬性均作為簡易類型來聲明。

如何聲明屬性?

定義屬性的文法是:

<xs:attribute name="xxx" type="yyy"/>

在此處,xxx 指屬性名稱,yyy 則規定屬性的資料類型。XML Schema 擁有很多内建的資料類型。

最常用的類型是:

xs:string

xs:decimal

xs:integer

xs:boolean

xs:date

xs:time

執行個體

這是帶有屬性的 XML 元素:

<lastname >Smith</lastname>

這是對應的屬性定義:

<xs:attribute name="lang" type="xs:string"/>

[i][b]屬性的預設值和固定值[/b][/i]

屬性可擁有指定的預設值或固定值。

當沒有其他的值被規定時,預設值就會自動配置設定給元素。

在下面的例子中,預設值是 "EN":

<xs:attribute name="lang" type="xs:string" default="EN"/>

固定值同樣會自動配置設定給元素,并且您無法規定另外的值。

在下面的例子中,固定值是 "EN":

<xs:attribute name="lang" type="xs:string" fixed="EN"/>

[i][b]可選的和必需的屬性[/b][/i]

對内容的限定

當 XML 元素或屬性擁有被定義的資料類型時,就會向元素或屬性的内容添加限定。

假如 XML 元素的類型是 "xs:date",而其包含的内容是類似 "Hello World" 的字元串,元素将不會(通過)驗證。

通過 XML schema,您也可向您的 XML 元素及屬性添加自己的限定。這些限定被稱為 facet

XSD 限定 / Facets

限定(restriction)用于為 XML 元素或者屬性定義可接受的值。對 XML 元素的限定被稱為 facet。(注:改限定支援正規表達式的Pattern)

[i][b]XSD 限定 / Facets[/b][/i]

限定(restriction)用于為 XML 元素或者屬性定義可接受的值。對 XML 元素的限定被稱為 facet。

[i][b]對值的限定[/b][/i]

下面的例子定義了帶有一個限定且名為 "age" 的元素。age 的值不能低于0或者高于120:

<xs:element name="age">

<xs:simpleType>

<xs:restriction base="xs:integer">

<xs:minInclusive value="0"/>

<xs:maxInclusive value="120"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

[i][b]對一組值的限定[/b][/i]

如需把 XML 元素的内容限制為一組可接受的值,我們要使用枚舉限制(enumeration constraint)。

下面的例子定義了帶有一個限定的名為 "car" 的元素。可接受的值隻有:Audi, Golf, BMW:

<xs:element name="car">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:enumeration value="Audi"/>

<xs:enumeration value="Golf"/>

<xs:enumeration value="BMW"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

上面的例子也可以被寫為:

<xs:element name="car" type="carType"/>

<xs:simpleType name="carType">

<xs:restriction base="xs:string">

<xs:enumeration value="Audi"/>

<xs:enumeration value="Golf"/>

<xs:enumeration value="BMW"/>

</xs:restriction>

</xs:simpleType>

注釋:在這種情況下,類型 "carType" 可被其他元素使用,因為它不是 "car" 元素的組成部分。

[i][b]對一系列值的限定[/b][/i]

如需把 XML 元素的内容限制定義為一系列可使用的數字或字母,我們要使用模式限制(pattern constraint)。

下面的例子定義了帶有一個限定的名為 "letter" 的元素。可接受的值隻有小寫字母 a - z 其中的一個:

<xs:element name="letter">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[a-z]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下一個例子定義了帶有一個限定的名為 "initials" 的元素。可接受的值是大寫字母 A - Z 其中的三個:

<xs:element name="initials">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[A-Z][A-Z][A-Z]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下一個例子也定義了帶有一個限定的名為 "initials" 的元素。可接受的值是大寫或小寫字母 a - z 其中的三個:

<xs:element name="initials">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[a-zA-Z][a-zA-Z][a-zA-Z]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下一個例子定義了帶有一個限定的名為 "choice 的元素。可接受的值是字母 x, y 或 z 中的一個:

<xs:element name="choice">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[xyz]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下一個例子定義了帶有一個限定的名為 "prodid" 的元素。可接受的值是五個阿拉伯數字的一個序列,且每個數字的範圍是 0-9:

<xs:element name="prodid">

<xs:simpleType>

<xs:restriction base="xs:integer">

<xs:pattern value="[0-9][0-9][0-9][0-9][0-9]"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

[i][b]對一系列值的其他限定[/b][/i]

下面的例子定義了帶有一個限定的名為 "letter" 的元素。可接受的值是 a - z 中零個或多個字母:

<xs:element name="letter">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="([a-z])*"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下面的例子定義了帶有一個限定的名為 "letter" 的元素。可接受的值是一對或多對字母,每對字母由一個小寫字母後跟一個大寫字母組成。舉個例子,"sToP"将會通過這種模式的驗證,但是 "Stop"、"STOP" 或者 "stop" 無法通過驗證:

<xs:element name="letter">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="([a-z][A-Z])+"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下面的例子定義了帶有一個限定的名為 "gender" 的元素。可接受的值是 male 或者 female:

<xs:element name="gender">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="male|female"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

下面的例子定義了帶有一個限定的名為 "password" 的元素。可接受的值是由 8 個字元組成的一行字元,這些字元必須是大寫或小寫字母 a - z 亦或數字 0 - 9:

<xs:element name="password">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:pattern value="[a-zA-Z0-9]{8}"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

[b][i]對空白字元的限定[/i][/b]

對空白字元的限定

如需規定對空白字元(whitespace characters)的處理方式,我們需要使用 whiteSpace 限定。

下面的例子定義了帶有一個限定的名為 "address" 的元素。這個 whiteSpace 限定被設定為 "preserve",這意味着 XML 處理器不會移除任何空白字元:

<xs:element name="address">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:whiteSpace value="preserve"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

這個例子也定義了帶有一個限定的名為 "address" 的元素。這個 whiteSpace 限定被設定為 "replace",這意味着 XML 處理器将移除所有空白字元(換行、回車、空格以及制表符):

<xs:element name="address">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:whiteSpace value="replace"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

這個例子也定義了帶有一個限定的名為 "address" 的元素。這個 whiteSpace 限定被設定為 "collapse",這意味着 XML 處理器将移除所有空白字元(換行、回車、空格以及制表符會被替換為空格,開頭和結尾的空格會被移除,而多個連續的空格會被縮減為一個單一的空格):

<xs:element name="address">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:whiteSpace value="collapse"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

[i][b]對長度的限定[/b][/i]

如需限制元素中值的長度,我們需要使用 length、maxLength 以及 minLength 限定。

本例定義了帶有一個限定且名為 "password" 的元素。其值必須精确到 8 個字元:

<xs:element name="password">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:length value="8"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

這個例子也定義了帶有一個限定的名為 "password" 的元素。其值最小為 5 個字元,最大為 8 個字元:

<xs:element name="password">

<xs:simpleType>

<xs:restriction base="xs:string">

<xs:minLength value="5"/>

<xs:maxLength value="8"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

[i][b]資料類型的限定[/b][/i]

限定 描述

enumeration 定義可接受值的一個清單

fractionDigits 定義所允許的最大的小數位數。必須大于等于0。

length 定義所允許的字元或者清單項目的精确數目。必須大于或等于0。

maxExclusive 定義數值的上限。所允許的值必須小于此值。

maxInclusive 定義數值的上限。所允許的值必須小于或等于此值。

maxLength 定義所允許的字元或者清單項目的最大數目。必須大于或等于0。

minExclusive 定義數值的下限。所允許的值必需大于此值。

minInclusive 定義數值的下限。所允許的值必需大于或等于此值。

minLength 定義所允許的字元或者清單項目的最小數目。必須大于或等于0。

pattern 定義可接受的字元的精确序列。

totalDigits 定義所允許的阿拉伯數字的精确位數。必須大于0。

whiteSpace 定義空白字元(換行、回車、空格以及制表符)的處理方式。