XSD學習筆記-1

簡易元素的默認值和固定值

簡易元素可擁有指定的默認值或固定值。git

當沒有其餘的值被規定時,默認值就會自動分配給元素。學習

在下面的例子中,缺省值是 "red":ui

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

固定值一樣會自動分配給元素,而且您沒法規定另一個值。spa

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

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

可選的和必需的屬性

在缺省的狀況下,屬性是可選的。如需規定屬性爲必選,請使用 "use" 屬性:rest

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

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

對值的限定

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

<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>

對一組值的限定

如需把 XML 元素的內容限制爲一組可接受的值,咱們要使用枚舉約束(enumeration constraint)。ip

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

<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" />

<xs:simpleType >
  <xs:restriction base="xs:string">
    <xs:enumeration value="Audi"/>
    <xs:enumeration value="Golf"/>
    <xs:enumeration value="BMW"/>
  </xs:restriction>
</xs:simpleType>

註釋:在這種狀況下,類型 "carType" 可被其餘元素使用,由於它不是 "car" 元素的組成部分。

對一系列值的限定

如需把 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>

對一系列值的其餘限定

下面的例子定義了帶有一個限定的名爲 "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>

對空白字符的限定

如需規定對空白字符(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>

對長度的限定

如需限制元素中值的長度,咱們須要使用 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>

數據類型的限定

限定 描述
enumeration 定義可接受值的一個列表
fractionDigits 定義所容許的最大的小數位數。必須大於等於0。
length 定義所容許的字符或者列表項目的精確數目。必須大於或等於0。
maxExclusive 定義數值的上限。所容許的值必須小於此值。
maxInclusive 定義數值的上限。所容許的值必須小於或等於此值。
maxLength 定義所容許的字符或者列表項目的最大數目。必須大於或等於0。
minExclusive 定義數值的下限。所容許的值必需大於此值。
minInclusive 定義數值的下限。所容許的值必需大於或等於此值。
minLength 定義所容許的字符或者列表項目的最小數目。必須大於或等於0。
pattern 定義可接受的字符的精確序列。
totalDigits 定義所容許的阿拉伯數字的精確位數。必須大於0。
whiteSpace 定義空白字符(換行、回車、空格以及製表符)的處理方式。

在 XML Schema 中,咱們有兩種方式來定義複合元素:

1. 經過命名此元素,可直接對"employee"元素進行聲明,就像這樣:

<xs:element name="employee">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

假如您使用上面所描述的方法,那麼僅有 "employee" 可以使用所規定的複合類型。請注意其子元素,"firstname" 以及 "lastname",被包圍在指示器 <sequence>中。這意味着子元素必須以它們被聲明的次序出現。您會在 XSD 指示器 這一節學習更多有關指示器的知識。

2. "employee" 元素可使用 type 屬性,這個屬性的做用是引用要使用的複合類型的名稱:

<xs:element name="employee" />

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

若是您使用了上面所描述的方法,那麼若干元素都可以使用相同的複合類型,好比這樣:

<xs:element name="employee" type="personinfo"/>
<xs:element name="student" type="personinfo"/>
<xs:element name="member" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

您也能夠在已有的複合元素之上以某個複合元素爲基礎,而後添加一些元素,就像這樣:

<xs:element name="employee" type="fullpersoninfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="fullpersoninfo">
  <xs:complexContent>    
      <xs:sequence>
        <xs:element name="address" type="xs:string"/>
        <xs:element name="city" type="xs:string"/>
        <xs:element name="country" type="xs:string"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

分割 Schema

前面的設計方法很是容易,但當文檔很複雜時卻難以閱讀和維護。

接下來介紹的設計方法基於首先對全部元素和屬性的定義,而後再使用 ref 屬性來引用它們。

這是用新方法設計的 schema 文件:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"><!-- 簡易元素的定義 --><xs:element name="orderperson" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/><!-- 屬性的定義 --><xs:attribute name="orderid" type="xs:string"/><!-- 複合元素的定義 --><xs:element name="shipto">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="name"/>
   <xs:element ref="address"/>
   <xs:element ref="city"/>
   <xs:element ref="country"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>
<xs:element name="item">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="title"/>
   <xs:element ref="note" minOccurs="0"/>
   <xs:element ref="quantity"/>
   <xs:element ref="price"/>
  </xs:sequence>
 </xs:complexType>
</xs:element>

<xs:element name="shiporder">
 <xs:complexType>
  <xs:sequence>
   <xs:element ref="orderperson"/>
   <xs:element ref="shipto"/>
   <xs:element ref="item" maxOccurs="unbounded"/>
  </xs:sequence>
  <xs:attribute ref="orderid" use="required"/>
 </xs:complexType>
</xs:element>

</xs:schema>

使用指定的類型(Named Types)

第三種設計方法定義了類或者類型,這樣使咱們有能力重複使用元素的定義。具體的方式是:首先對簡易元素和複合元素進行命名,而後經過元素的 type 屬性來指向它們。

這是利用第三種方法設計的 schema 文件 ("shiporder.xsd"):

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:simpleType name="stringtype"> </xs:simpleType>

<xs:simpleType name="inttype"> </xs:simpleType>

<xs:simpleType name="dectype"> </xs:simpleType>

<xs:simpleType name="orderidtype"> 
  <xs:pattern value="[0-9]{6}"/> </xs:simpleType>

<xs:complexType name="shiptotype">
 <xs:sequence>
  <xs:element name="name" type="stringtype"/>
  <xs:element name="address" type="stringtype"/>
  <xs:element name="city" type="stringtype"/>
  <xs:element name="country" type="stringtype"/>
 </xs:sequence>
</xs:complexType>

<xs:complexType name="itemtype">
 <xs:sequence>
  <xs:element name="title" type="stringtype"/>
  <xs:element name="note" type="stringtype" minOccurs="0"/>
  <xs:element name="quantity" type="inttype"/>
  <xs:element name="price" type="dectype"/>
 </xs:sequence>
</xs:complexType>

<xs:complexType name="shipordertype">
 <xs:sequence>
  <xs:element name="orderperson" type="stringtype"/>
  <xs:element name="shipto" type="shiptotype"/>
  <xs:element name="item" maxOccurs="unbounded" type="itemtype"/>
 </xs:sequence>
 <xs:attribute name="orderid" type="orderidtype" use="required"/>
</xs:complexType>

<xs:element name="shiporder" type="shipordertype"/>

</xs:schema>

restriction 元素顯示出數據類型源自於 W3C XML Schema 命名空間的數據類型。所以,下面的片斷也就意味着元素或屬性的值必須是字符串類型的值:

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

restriction 元素常被用於向元素施加限制。請看下面這些來自以上 schema 的片斷:

<xs:simpleType name="orderidtype">
 <xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{6}"/>
 </xs:restriction>
</xs:simpleType>

這段代碼指示出,元素或屬性的值必須爲字符串,而且必須是連續的六個字符,同時這些字符必須是 0-9 的數字。

相關文章
相關標籤/搜索