2007年5月10日

          [原創] 跟我學XML Schema(1):最簡單的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 @ 2007-05-12 01:49 dodo.loveme 閱讀(294) | 評論 (0)編輯 收藏

          客戶對象要使用服務提供方的類,可是要根據實際情況來選擇服務提供方所提供的類,然后客戶對象要在自己的代碼中加入判斷實際情況的代碼。造成耦合性比較高。

          可以使用工廠方法來解決問題,該方法封裝了判斷實際情況的代碼。客戶對象只需要調用工廠類提供的方法,工廠類自己會對實際情況進行判斷,然后把客戶對象需要的服務提供方的類返回給客戶。

          posted @ 2007-05-10 13:20 dodo.loveme 閱讀(316) | 評論 (2)編輯 收藏

          主站蜘蛛池模板: 台中县| 宁晋县| 民县| 桐柏县| 铜陵市| 东莞市| 杭锦后旗| 宜章县| 宣威市| 五家渠市| 宿迁市| 鄂州市| 济南市| 抚远县| 兴业县| 浮梁县| 陈巴尔虎旗| 屏山县| 林州市| 海伦市| 台江县| 云霄县| 唐山市| 金沙县| 清丰县| 崇文区| 宁远县| 敦煌市| 南陵县| 茌平县| 富民县| 泊头市| 大洼县| 新乡县| 盐亭县| 射洪县| 平南县| 宜都市| 炎陵县| 利辛县| 浦县|