隨筆 - 1, 文章 - 44, 評論 - 2, 引用 - 0
          數據加載中……

          [原創] 跟我學XML Schema

          如何寫一個最簡單的XML?Schema文檔呢?

          首先,我們寫出一個最簡單的XML文檔.

          hello.xml
          -------------------
          <?xml?version="1.0"?>?
          <greeting>Hello?World!!</greeting>

          (一個根元素:greeting;且這個元素不含屬性,無子元素,內容是字符串。)

          hello.xsd
          ----------
          <?xml?version="1.0"?>?
          <xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          ??<xsd:element?name="greeting"?type="xsd:string"/>
          </xsd:schema>

          XML?Schema文檔后綴名是.xsd,完全符合XML語法,根元素是schema,命名空間xmlns:xsd="http://www.w3.org/2001/XMLSchema,用元素<element>定義實例文檔中的元素,如greeting。


          跟我學XML?Schema(2):含子元素的稍復雜Schema文檔?

          假設實例文檔是如下的:

          customer.xml
          -----------
          <customer>
          ??<name>teiki</name>
          ??<address>No.237,?Road?Waitan,?Shanghai</address>
          </customer>

          則可以寫出以下的XML?Schema文檔:
          customer.xsd
          ----------------
          1:?<?xml?version="1.0"?>
          2:?<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          3:???<xsd:element?name="customer">
          4:????<xsd:complexType>
          5:??????<xsd:sequence>
          6:????????<xsd:element?name="name"?type="xsd:string"/>
          7:????????<xsd:element?name="address"?type="xsd:string"?/>
          8:??????</xsd:sequence>
          9:????</xsd:complexType>
          10:??</xsd:element>
          11:?</xsd:schema>

          實例文檔customer.xml中,<customer>元素含有兩個子元素,所以我們在Schema文檔中采用ComplexType來定義該元素。

          sequence表示子元素依次出現的順序。


          跟我學XML?Schema(3):含子元素和孫元素的更復雜Schema文檔

          這次我們給出一個更加復雜一些的文檔:

          address.xml
          ---------------
          <customer>
          ??<name>Teiki</name>
          ??<address>
          ????<!--?address追加一個地址子元素?-->
          ????<prefecture>Zhejiang</prefecture>
          ????<city>Hangzhou</city>
          ????<street>Xilu?Road,?No.121,?7F</street>
          ??</address>
          </customer>


          為此,我們需要一個更加復雜一點的Schema文檔:

          address.xsd
          -----------------
          1:?<?xml?version="1.0"?>
          2:?<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          3:
          4:???<xsd:element?name="customer">
          5:?????<xsd:complexType>
          6:???????<xsd:sequence>
          7:?????????<xsd:element?name="name"?type="xsd:string"/>
          8:?????????<!--?追加子元素address-->
          9:?????????<xsd:element?name="address">
          10:??????????<xsd:complexType>
          11:????????????<xsd:sequence>
          12:??????????????<xsd:element?name="prefecture"?type="xsd:string"/>
          13:??????????????<xsd:element?name="city"?type="xsd:string"?/>
          14:??????????????<xsd:element?name="street"?type="xsd:string"?/>
          15:????????????</xsd:sequence>
          16:??????????</xsd:complexType>
          17:????????</xsd:element>
          18:????????<!--?end?-->
          19:??????</xsd:sequence>
          20:????</xsd:complexType>
          21:??</xsd:element>
          22:
          23:</xsd:schema>
          不過,我們還可以采用ref元素來重新編寫這個Schema文檔:
          address2.xsd
          ----------------------
          1:?<?xml?version="1.0"?>
          2:?<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          3:
          4:???<xsd:element?name="customer">
          5:?????<xsd:complexType>
          6:???????<xsd:sequence>
          7:?????????<xsd:element?name="name"?type="xsd:string"/>
          8:?????????<xsd:element?ref="address"/>
          9:???????</xsd:sequence>
          10:????</xsd:complexType>
          11:??</xsd:element>
          12:
          13:??<xsd:element?name="address">
          14:????<xsd:complexType>
          15:??????<xsd:sequence>
          16:????????<xsd:element?name="prefecture"?type="xsd:string"/>
          17:????????<xsd:element?name="city"?type="xsd:string"?/>
          18:????????<xsd:element?name="street"?type="xsd:string"?/>
          19:??????</xsd:sequence>
          20:????</xsd:complexType>
          21:??</xsd:element>
          22:
          23:?</xsd:schema>
          使用ref元素可以直接將其指向另一個模塊,使文檔更加具有可讀性。

          跟我學XML?Schema(4):如何定義屬性呢??


          加入實例文檔的元素包含屬性,怎么辦呢?

          customer2.xml
          ---------------
          <customer?id="001718">
          ??<name>Teiki</name>
          ??<address>No.237,?Road?Waitan,?Shanghai</address>
          </customer>

          那就這樣寫Schema文檔:
          customer2.xsd
          ------------------
          1:?<?xml?version="1.0"?>
          2:?<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          3:
          4:???<xsd:element?name="customer">
          5:????<xsd:complexType>
          6:??????<xsd:sequence>
          7:????????<xsd:element?name="name"?type="xsd:string"/>
          8:????????<xsd:element?name="address"?type="xsd:string"?/>
          9:??????</xsd:sequence>
          10:??????<!--?增加屬性定義?-->
          11:??????<xsd:attribute?name="id"?type="xsd:string"/>
          12:????</xsd:complexType>
          13:??</xsd:element>
          14:
          15:?</xsd:schema>

          很簡單,在<sequence>元素定義完成后,再用<attribute>元素id。

          跟我學XML?Schema(5):如何定義相同子元素的數量??

          先看這個簡單的訂購數據實例文檔:

          order.xml
          ---------
          <order>
          ??<orderItem>Accounting?Book</orderItem>
          ??<orderItem>Taxation?Book</orderItem>
          </order>

          假設<orderItem>元素,即每次的訂購書目不能超過10種,那該怎么寫這個Schema文檔呢?這里要用到<element>的maxOccurs屬性。

          order.xsd
          --------------------
          1:<?xml?version="1.0"?>
          2:<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          3:
          4:??<xsd:element?name="order">
          5:????<xsd:complexType>
          6:??????<xsd:sequence>
          7:????????<xsd:element?name="orderItem"???type="xsd:string"??maxOccurs="10"?/>
          8:??????</xsd:sequence>
          9:????</xsd:complexType>
          10:??</xsd:element>
          11:
          12:</xsd:schema>

          第7行中的maxOccurs屬性為10,代表orderItem元素可以最大有10個。如果,不設定元素個數,則可以用maxOccurs="unbounded"來定義.

          類似,如果要定義最小值,可以使用minOccurs,比如下面這句:
          <xsd:element?name="orderItem"?type="xsd:string"?minOccurs="5"?maxOccurs="10"/>
          這兩個屬性缺省值都是1。

          跟我學XML?Schema(6):如何定義可選項的子元素?

          假如上面的訂書數據中,可以用書名或者書號任一一種訂購,則實例文檔可能如下:

          order2.xml
          -----------------
          <order>
          ??<orderItem>
          ????<!--書名訂購-->
          ????<name>Accounting?Book</name>
          ??</orderItem>
          ??<orderItem>
          ????<!--書號訂購-->
          ????<id>7-5058-3496-7</id>
          ??</orderItem>
          </order>

          這時書寫Schema文檔還需要使用choice元素。

          order2.xsd
          -------------------------
          1:<?xml?version="1.0"?>
          2:<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          3:
          4:??<xsd:element?name="order">
          5:????<xsd:complexType>
          6:??????<xsd:sequence>
          7:????????<xsd:element?ref="orderItem"?maxOccurs="10"?/>
          8:??????</xsd:sequence>
          9:????</xsd:complexType>
          10:??</xsd:element>
          11:
          12:??<xsd:element?name="orderItem">
          13:????<xsd:complexType>
          14:??????<xsd:choice>
          15:????????<xsd:element?name="name"?type="xsd:string"/>
          16:????????<xsd:element?name="id"?type="xsd:string"/>
          17:??????</xsd:choice>
          18:????</xsd:complexType>
          19:??</xsd:element>
          20:
          21:</xsd:schema>

          跟我學XML?Schema(7):稍微更復雜的可選項子元素

          再稍微修改一下訂書數據的實例文檔:

          order3.xml
          -----------------
          <order>
          ??<orderItem>
          ????<name>Accounting?Book</name>
          ????<quantity>2</quantity>
          ??</orderItem>
          ??<orderItem>
          ????<id>7-5058-3496-7</id>
          ??</orderItem>
          </order>

          這里假定<quantity>值為1時,缺省。

          如何修改Schema文檔呢?

          order3.xsd
          -----------------
          1:<?xml?version="1.0"?>
          2:<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          3:
          4:??<xsd:element?name="order">
          5:????<xsd:complexType>
          6:??????<xsd:sequence>
          7:????????<xsd:element?ref="orderItem"?maxOccurs="10"/>
          8:??????</xsd:sequence>
          9:????</xsd:complexType>
          10:??</xsd:element>
          11:
          12:??<xsd:element?name="orderItem">
          13:????<xsd:complexType>
          14:??????<xsd:sequence>
          15:????????<xsd:choice>
          16:??????????<xsd:element?name="name"?type="xsd:string"/>
          17:??????????<xsd:element?name="id"?type="xsd:string"/>
          18:????????</xsd:choice>
          19:????????<xsd:element?name="quantity"?type="xsd:string"?minOccurs="0"/>
          20:??????</xsd:sequence>
          21:????</xsd:complexType>
          22:??</xsd:element>
          23:
          24:</xsd:schema>

          19行中的quantity最少出現值為0,也就是可以有,也可以沒有。
          當然,也可以直接在<choice>元素中,包含quantity,然后定義它的minOccurs。

          跟我學XML?Schema(8):內置簡單類型

          內建于XML?Schema的簡單類型有44種。他們在XML?Schema推薦標準的第二部分中公布,下面這是一張內置類型的層次結構圖:

          http://www.w3.org/TR/2001/PR-xmlschema-2-20010330/type-hierarchy.jpg

          跟我學XML?Schema(9):自定義簡單類型

          如果內置簡單類型的44種還不能滿足要求,怎么辦呢?下面學習自定義簡單類型。(XML的擴展性充分體現在這里)

          例如這個實例文檔:

          order4.xml
          -----------------
          <order>
          ??<orderItem>
          ????<id>7-5058-3496-7</id>
          ????<quantity>5</quantity>
          ??</orderItem>
          </order>

          ID是一個標準的ISBN編碼,我們怎么定義這個ISBN編碼呢?

          <xsd:simpleType?name="idType">
          ??<xsd:restriction?base="xsd:string">
          ????<xsd:pattern?value="\d{1}-\d{4}-\d{4}-\d{1}"/>
          ??</xsd:restriction>
          </xsd:simpleType>

          idType是一個自定義的簡單類型。
          我們對它做了限制:
          <xsd:restriction?base="xsd:string">代表它是基于一個字符串類型。再用pattern元素來描述該字符串的形式。

          value="\d{1}-\d{4}-\d{4}-\d{1}"這是一個正則表達式,關于正則表達式,以后再介紹。嘻嘻!

          利用這個自定義的簡單類型,我們可以重新寫Schema文檔:

          order4.xsd
          ---------------
          1:<?xml?version="1.0"?>
          2:<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          3:
          4:??<xsd:element?name="order">
          5:????<xsd:complexType>
          6:??????<xsd:sequence>
          7:????????<xsd:element?ref="orderItem"?maxOccurs="10"/>
          8:??????</xsd:sequence>
          9:????</xsd:complexType>
          10:??</xsd:element>
          11:
          12:??<xsd:element?name="orderItem">
          13:????<xsd:complexType>
          14:??????<xsd:sequence>
          15:????????<xsd:element?name="id"?type="idType"/>
          16:????????<xsd:element?name="quantity"?type="xsd:integer"/>
          17:??????</xsd:sequence>
          18:????</xsd:complexType>
          19:??</xsd:element>
          20:??
          21:??<xsd:simpleType?name="idType">
          22:????<xsd:restriction?base="xsd:string">
          23:??????<xsd:pattern?value="\d{1}-\d{4}-\d{4}-\d{1}"/>
          24:????</xsd:restriction>
          25:??</xsd:simpleType>
          26:??
          27:</xsd:schema>


          假如我們事先確定好ID只有3個,即只有3個ISBN是可選的,那怎么辦?我們可以用enumeration元素來進行列舉。

          <xsd:simpleType?name="idType">
          ??<xsd:restriction?base="xsd:string">
          ????<xsd:enumeration?value="7-5058-3496-7"/>
          ????<xsd:enumeration?value="7-5005-6450-3"/>
          ????<xsd:enumeration?value="7-3020-6069-7"/>
          ??</xsd:restriction>
          </xsd:simpleType>


          再來看訂購量quantity的值,如果我們設定其值必須在1-10之間,該怎么辦呢?可以這些自定義一個簡單類型。

          <xsd:simpleType?name="quantityType">
          ??<xsd:restriction?base="xsd:integer">
          ????<xsd:minInclusive?value="1"/>
          ????<xsd:maxInclusive?value="10"/>
          ??</xsd:restriction>
          </xsd:simpleType>

          其中,minInclusive,maxInclusive分別代表該類型的取值范圍。

          所以最終修改后的Schema文檔如下:

          order4-1.xsd
          ----------------------
          1:<?xml?version="1.0"?>
          2:<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          3:
          4:??<xsd:element?name="order">
          5:????<xsd:complexType>
          6:??????<xsd:sequence>
          7:????????<xsd:element?ref="orderItem"?maxOccurs="10"/>
          8:??????</xsd:sequence>
          9:????</xsd:complexType>
          10:??</xsd:element>
          11:
          12:??<xsd:element?name="orderItem">
          13:????<xsd:complexType>
          14:??????<xsd:sequence>
          15:????????<xsd:element?name="id"?type="idType"/>
          16:????????<xsd:element?name="quantity"?type="quantityType"/>
          17:??????</xsd:sequence>
          18:????</xsd:complexType>
          19:??</xsd:element>
          20:??
          21:??<xsd:simpleType?name="idType">
          22:????<xsd:restriction?base="xsd:string">
          23:??????<xsd:enumeration?value="7-5058-3496-7"/>
          ????<xsd:enumeration?value="7-5005-6450-3"/>
          ????<xsd:enumeration?value="7-3020-6069-7"/>
          26:????</xsd:restriction>
          27:??</xsd:simpleType>
          28:??
          29:??<xsd:simpleType?name="quantityType">
          30:????<xsd:restriction?base="xsd:integer">
          31:??????<xsd:minInclusive?value="1"/>
          32:??????<xsd:maxInclusive?value="10"/>
          33:????</xsd:restriction>
          34:??</xsd:simpleType>
          35:
          36:</xsd:schema>

          跟我學XML?Schema(10):定義屬性

          最后,我們再來講講元素的屬性如何在Schema文檔中定義。

          比如上面的order.xml實例文檔中:

          <order>
          ??<orderItem?id="7-5058-3496-7"?/>
          </order>

          對此,我們在Schema文檔中采用一個attribute來定義:

          order.xsd
          ---------
          <xsd:element?name="orderItem">
          ??<xsd:complexType>
          ????<xsd:sequence>  ←空元素
          ????</xsd:sequence> ?
          ????
          ????<!--定義該元素屬性-->
          ????<xsd:attribute?name="id"?type="xsd:string"/>
          ??</xsd:complexType>
          </xsd:element>

          那么,實例文檔中該屬性值是必須的還是可有可無的呢?我們可以這樣限制:

          <xsd:attribute?name="id"?type="idType"?use="required"/>

          這里我們講id屬性類型作為一種自定義數據類型idType。
          而且,用attribute元素的use屬性來定義是否是必須的屬性。
          required是必須值,optional是可選值,prohibited是無屬性值。


          那么對于屬性的缺省值,我們怎么定義呢?
          比如:
          <order>
          ??<orderItem?id="4-8443-1780-6"?quantity="3"/>
          </order>

          我們還可以用attribute元素的另一個屬性default來定義:
          <xsd:attribute?name="quantity"?type="xsd:integer"?default="1"/>

          所以,我們可以重新寫出一個Schema文檔:

          order2.xsd
          --------------
          <xsd:element?name="orderItem">
          ??<xsd:complexType>
          ????<xsd:sequence></xsd:sequence>
          ????<xsd:attribute?name="id"?type="idType"?use="required"/>
          ????<xsd:attribute?name="quantity"?type="xsd:integer"?default="1"/>
          ??</xsd:complexType>
          </xsd:element>

          上面的屬性我們定義我們還可以采用屬性組的辦法來重新改寫Schema文檔。

          order3.xsd
          ----------------
          1:????<xsd:element?name="orderItem">
          2:??????<xsd:complexType>
          3:????????<xsd:sequence></xsd:sequence>
          4:????????<xsd:attributeGroup?ref="orderItemAttributes"/>
          5:??????</xsd:complexType>
          6:????</xsd:element>
          7:
          8:????<xsd:attributeGroup?name="orderItemAttributes">
          9:??????<xsd:attribute?name="id"?type="idType"?use="required"/>
          10:??????<xsd:attribute?name="quantity"?type="xsd:integer"?default="1"/>
          11:????</xsd:attributeGroup>

          這個屬性組就不詳細解釋了,不過,大家一看就清楚了吧。

          最后,我們寫一個完整的訂書order.xml的Schema文檔。
          1:??<?xml?version="1.0"?>
          2:??<xsd:schema?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          3:
          4:????<xsd:element?name="order">
          5:??????<xsd:complexType>
          6:????????<xsd:sequence>
          7:??????????<xsd:element?ref="orderItem"?maxOccurs="10"/>
          8:????????</xsd:sequence>
          9:??????</xsd:complexType>
          10:????</xsd:element>
          11:
          12:????<xsd:element?name="orderItem">
          13:??????<xsd:complexType>
          14:????????<xsd:sequence></xsd:sequence>
          15:????????<xsd:attributeGroup?ref="orderItemAttributes"/>
          16:??????</xsd:complexType>
          17:????</xsd:element>
          18:
          19:????<xsd:attributeGroup?name="orderItemAttributes">
          20:??????<xsd:attribute?name="id"?type="idType"?use="required"/>
          21:??????<xsd:attribute?name="quantity"?type="xsd:integer"?default="1"/>
          22:????</xsd:attributeGroup>
          23:
          24:????<xsd:simpleType?name="idType">
          25:??????<xsd:restriction?base="xsd:string">
          26:????????<xsd:pattern?value="\d{1}-\d{4}-\d{4}-\d{1}"/>
          27:??????</xsd:restriction>
          28:????</xsd:simpleType>
          29:
          30:??</xsd:schema>

          posted on 2006-05-29 22:31 ASONG 閱讀(185) 評論(0)  編輯  收藏 所屬分類: JAVA

          主站蜘蛛池模板: 安仁县| 阜南县| 进贤县| 大石桥市| 钟山县| 隆化县| 阜南县| 灵石县| 扬州市| 呼和浩特市| 喀喇沁旗| 吉林省| 丹东市| 雷波县| 收藏| 佛学| 监利县| 安塞县| 沭阳县| 镇安县| 任丘市| 鹤庆县| 库尔勒市| 天镇县| 龙山县| 淮北市| 菏泽市| 日土县| 兴和县| 安福县| 罗山县| 吴川市| 榆中县| 富源县| 翼城县| 张家口市| 英超| 新竹市| 外汇| 卓尼县| 镇巴县|