隨筆-10  評(píng)論-36  文章-6  trackbacks-0

          XML SCHEMA教程

          本教程是筆者學(xué)習(xí)W3C的《XML Schema Tutorial》的筆記。如果你對(duì)原教程感興趣,可以瀏覽http://www.w3schools.com/schema/default.asp

          XML Schema是W3C制定的基于XML格式的XML文檔結(jié)構(gòu)描述標(biāo)準(zhǔn)。作為一種文檔描述語(yǔ)言,通常我們將其簡(jiǎn)寫為XSD(XML Schema Define)。XSD作為DTD(文檔類型定義)的替代者,已經(jīng)廣泛地應(yīng)用到各種商業(yè)應(yīng)用。使用XSD,我們不僅可以描述XML文檔的結(jié)構(gòu)以便頒布業(yè)務(wù)標(biāo)準(zhǔn),而且可以使用支持XSD的通用化XML解析器對(duì)XML文檔進(jìn)行解析并自動(dòng)地檢查其是否滿足給定的業(yè)務(wù)標(biāo)準(zhǔn)。應(yīng)用XSD校驗(yàn)XML文檔的結(jié)構(gòu)后,我們不僅驗(yàn)證了XML文檔的有效性(Well-Formed Document),還驗(yàn)證了XML文檔的合法性,甚至驗(yàn)證了XML文檔各域的值合法性(數(shù)據(jù)類型與編碼值),而且這些驗(yàn)證工作不必我們編寫任何代碼,只需使用支持XSD的通用化XML文檔解析器即可完成。這就給應(yīng)用軟件帶來(lái)了巨大的靈活性,以前需要借助數(shù)據(jù)庫(kù)或配置文件才能完成的參數(shù)化管理,現(xiàn)在只需按照新的業(yè)務(wù)需求發(fā)布新的XML Schema即可。

          作為一個(gè)入門,下面列出一個(gè)XML文檔及其XSD文檔,使我們對(duì)XSD有個(gè)簡(jiǎn)單的認(rèn)識(shí):

          XML:

          <?xml version="1.0"?>

          <note xmlns="http://www.w3schools.com"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://www.w3schools.com note.xsd">

          <to>Tove</to>

          <from>Jani</from>

          <heading>Reminder</heading>

          <body>Don't forget me this weekend!</body>

          </note>

          XSD:

          <?xml version="1.0"?>                                       (1)

          <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"      (2)

          targetNamespace="http://www.w3schools.com"

          xmlns="http://www.w3schools.com"

          elementFormDefault="qualified">

          <xs:element name="note">                                (3)

              <xs:complexType>                                    (4)

                <xs:sequence>                                     (5)

                    <xs:element name="to" type="xs:string"/>      (6)

                    <xs:element name="from" type="xs:string"/>    (7)

                    <xs:element name="heading" type="xs:string"/>8)

                    <xs:element name="body" type="xs:string"/>    (9)

                </xs:sequence>

              </xs:complexType>

          </xs:element>

          </xs:schema>

          說(shuō)明如下:

          (1)<?xml version="1.0" ncoding="UTF-8"?>  

          XML文檔定義,描述本文檔使用的XML標(biāo)準(zhǔn)版本及文檔編碼標(biāo)準(zhǔn)。

          2)<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

          targetNamespace="http://www.w3schools.com"

          xmlns="http://www.w3schools.com"

          elementFormDefault="qualified">

          l         <xs:schema> 是所有XSD文檔的根元素,其屬性描述文檔的名空間及文檔引用;

          l         xmlns:xs="http://www.w3.org/2001/XMLSchema" 指示使用xs:作前綴的元素、屬性、類型等名稱是屬于http://www.w3.org/2001/XMLSchema名空間的。

          l         targetNamespace="http://www.w3schools.com" 指示本文檔定義的元素、屬性、類型等名稱屬于http://www.w3schools.com名空間;

          l         xmlns="http://www.w3schools.com" 指示缺省的名空間是http://www. w3schools.com,即沒(méi)有前綴的元素、屬性、類型等名稱是屬于該名空間的。

          l         elementFormDefault="qualified" 指示使用本XSD定義的XML文檔所使用的元素必須在本文檔中定義且使用名空間前綴。

          (3)<xs:element name="note">

              定義一個(gè)元素,該元素的名稱是note,即XML中的<note>;

          (4)<xs:complexType>

              <note>元素的類型是復(fù)雜類型,具體格式由子元素定義;

          (5)<xs:sequence>

              <note>元素的子元素必須按順序出現(xiàn)。具體的順序由子元素的定義順序決定;

          6)<xs:element name="to" type="xs:string"/>

               定義一個(gè)元素<to>,其類型是string,且其是<note>的第1個(gè)子元素;

          7)<xs:element name="from" type="xs:string"/>

               定義一個(gè)元素<from>,其類型是string,且其是<note>的第2個(gè)子元素;

          8)<xs:element name="heading" type="xs:string"/>

               定義一個(gè)元素<heading>,其類型是string,且其是<note>的第3個(gè)子元素;

          9)<xs:element name="body" type="xs:string"/>

               定義一個(gè)元素<body>,其類型是string,且其是<note>的第4個(gè)子元素;

          上面的說(shuō)明可以看出我們描述的XML文檔應(yīng)滿足這些要求:根元素是<note>;<note>可以包含四個(gè)子元素,分別是<to>、<from>、<heading>、<body>,且必須按<to>、<from>、<heading>、<body>的順序出現(xiàn);四個(gè)子元素都是string類型的。

          1          格式良好文檔

          滿足下列要求的XML文檔,稱為格式良好的文檔(Well-Formed Document):

          (1)       使用XML定義打頭,如:<?xml version="1.0" encoding="UTF-8"?>;

          (2)       文檔僅包含一個(gè)唯一的根元素;

          (3)       起始標(biāo)記(<xxx>)必須與結(jié)束標(biāo)記(</xxx>)匹配;

          (4)       大小寫敏感;

          (5)       所有元素是閉合的(<必須與>配套);

          (6)       所有元素嵌套是正確的;

          (7)       所有屬性使用""或’’括;

          (8)       entities must be used for special characters

          應(yīng)注意到,滿足上述要求的文檔只能算是有效的文檔,但不能算是合法的文檔。例如,業(yè)務(wù)標(biāo)準(zhǔn)要求文檔中必須包含5個(gè)<SEG>元素,如果文檔中僅包含了4個(gè),它仍是格式良好的文檔,但不滿足業(yè)務(wù)標(biāo)準(zhǔn)要求,是一個(gè)非法的文檔。

          2          XSD應(yīng)用的場(chǎng)合

          (1)       定義文檔中可以出現(xiàn)的元素;

          (2)       定義文檔中可以出現(xiàn)的屬性;

          (3)       定義元素包含哪些子元素;

          (4)       定義元素出現(xiàn)的順序;

          (5)       定義元素出現(xiàn)的次數(shù);

          (6)       定義哪些元素是空或可以包含text;

          (7)       定義元素與屬性的數(shù)據(jù)類型;

          (8)       定義元素與屬性的缺省值或固定值或值范圍、值列表。

          3          XSD相對(duì)于 DTD的優(yōu)勢(shì)

          (1)XSD支持?jǐn)?shù)據(jù)類型;

          l         易于描述許可的文檔組成;

          l         易于校驗(yàn)數(shù)據(jù)的合法性;

          l         易于使用數(shù)據(jù)庫(kù)中的數(shù)據(jù);

          l         易于定義數(shù)據(jù)的約束;

          l         易于定義數(shù)據(jù)的模式;

          l         易于在不同數(shù)據(jù)類型間進(jìn)行格式轉(zhuǎn)換

          (2)XSD使用XML語(yǔ)法;

          (3)XSD使數(shù)據(jù)交換更安全,因?yàn)樗枋隽藬?shù)據(jù)的格式,避免了歧義;

          (4)XSD可以擴(kuò)展,支持類型的擴(kuò)展和結(jié)構(gòu)的擴(kuò)展。

          4          文檔引用

          XSD支持名空間(NameSpace)和文檔引用。通過(guò)名空間,可以避免文檔引用中可能導(dǎo)致的名稱重復(fù)問(wèn)題。W3C規(guī)定XSD的名空間使用URI作為名稱。以前面的XML為例:

          <note xmlns="http://www.w3schools.com"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://www.w3schools.com note.xsd">

          l         xmlns="http://www.w3schools.com" 指示本文檔缺省的名空間,即沒(méi)有前綴的所有的元素應(yīng)在該空間中定義;

          l         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 指示本文檔要引用http://www.w3.org/2001/XMLSchema-instance名空間定義的名稱,其前綴是xsi;

          l         xsi:schemaLocation="http://www.w3schools.com note.xsd" 指示本文檔要引用的http://www.w3schools.com 名空間的XSD文檔是note.xsd。如果要引用多個(gè)名空間的XSD文檔,則使用空格分隔多個(gè)‘Namespace xsd’對(duì)。例如:http://www.acom.com a.xsd http://www.bcom.com b.xsd...。如果XSD文檔沒(méi)有使用名空間,則使用xsi:noNamespaceSchemaLocation="note.xsd"代替xsi:schemaLocation。

          5          簡(jiǎn)單元素描述

          簡(jiǎn)單元素指只包含text的XML元素,它沒(méi)有任何子元素或?qū)傩裕纾?lt;sex>男</sex>。簡(jiǎn)單元素可以附加地定義其缺省值或固定值。XSD定義簡(jiǎn)單元素的格式是:<xs:element name="xxx" type="ttt" [default="defval"] [fixed="fixedval"]>。其中ttt使用XSD標(biāo)準(zhǔn)定義的基本類型,即:xs:string、xs:decimal、xs:integer、xs:boolean、xs:date、 xs:time等。例如:<xs:element name=sex type=xs:string default=>。

          使用上述方式定義的簡(jiǎn)單元素只能限定元素的數(shù)據(jù)類型、缺省值、固定值。如果希望限定該簡(jiǎn)單元素的取值范圍等約束,則應(yīng)使用簡(jiǎn)單類型定義,并在簡(jiǎn)單類型中嵌套值約束子元素。如:

          <xs:element name="sex">

          <xs:simpleType>

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

          <xs:enumeration value="男"/>

          <xs:enumeration value="女"/>

          </xs:restriction>

          </xs:simpleType>

          </xs:element>

          其中,約束的定義方式參考第6節(jié)。

          6          復(fù)雜元素描述

          復(fù)雜元素指包含屬性或子元素的XML元素,如:<student name=Li sex=>,主要包括下列四類:

          l         空元素:只包含屬性的元素。如:<student name=li />;

          l         只包含屬性與子元素的元素。如:

          <name type=realname>

          <firstname>Jack</firstname>

          <lastname>Tom</lastname>

                </name>

          l         只包含屬性與text的元素。如:

          <name type=firstname>Jack</name>

          l         只包含屬性、text和子元素的元素。如:

              <name type=realname>

                  Your name is:

                 <firstname>xxx</firstname>

                 <lastname>xxx</lastname>

          </name>

          復(fù)雜元素是一種復(fù)雜類型,可以使用下面兩種描述方式,一是復(fù)合結(jié)構(gòu),二是分離結(jié)構(gòu)。復(fù)合結(jié)構(gòu),則直接將復(fù)雜類型定義為復(fù)雜元素的子元素;分離結(jié)構(gòu)則是將復(fù)雜類型定義在外部,由復(fù)雜元素引用。

          l         復(fù)合結(jié)構(gòu)

          <xs:element name="xxx">

          <xs:complexType>

              ...

                  </xs:complexType>

          </xs:element>

          l         分離結(jié)構(gòu)

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

          <xs:complexType name=”yyy”>

              ...

              </xs:complexType>

          這兩種描述結(jié)構(gòu)也適合于屬性、簡(jiǎn)單元素的描述。如果XSD元素中存在大量可復(fù)用的自定義數(shù)據(jù)類型時(shí),建議使用分離式的定義結(jié)構(gòu)。

          6.1    數(shù)據(jù)類型

          XSD的數(shù)據(jù)類型包括基本數(shù)據(jù)類型、簡(jiǎn)單數(shù)據(jù)類型、復(fù)雜數(shù)據(jù)類型三類。基本數(shù)據(jù)類型指W3C標(biāo)準(zhǔn)定義的數(shù)據(jù)類型,主要包括xs:integer、xs:string、xs:date、xs:boolean等。簡(jiǎn)單數(shù)據(jù)類型是基本數(shù)據(jù)類型的擴(kuò)展,對(duì)取值進(jìn)行約束;復(fù)雜數(shù)據(jù)類型則是一個(gè)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),通常包含了屬性或子元素定義。

          (1)       簡(jiǎn)單類型

          簡(jiǎn)單類型擴(kuò)展基本數(shù)據(jù)類型,并對(duì)值施加一定的約束。如:

              <xs:simpleType name="XSDSimpleType">

                  <xs:restriction base="dateTime">

                     <xs:enumeration value="value1" />

                     <xs:enumeration value="value2" />

                     <xs:enumeration value="value3" />

                  </xs:restriction>

              </xs:simpleType>

              <xs:simpleType name="XSDSimpleType">

                 <xs:list itemType="dateTime">

                     <xs:enumeration value="value1" />

                     <xs:enumeration value="value2" />

                     <xs:enumeration value="value3" />

                 </xs:list>

              </xs:simpleType>

              <xs:simpleType name="XSDSimpleType">

                 <xs:union memberTypes="dateTime">

                     <xs:enumeration value="value1" />

                     <xs:enumeration value="value2" />

                     <xs:enumeration value="value3" />

                 </xs:union>

              </xs:simpleType>

          (2)       復(fù)雜類型

          復(fù)雜類型通常是復(fù)雜元素的數(shù)據(jù)類型或復(fù)雜元素的子元素,描述復(fù)雜元素的子元素、屬性以及子元素與屬性的類型。參看后續(xù)各小節(jié)的描述。

          6.2    約束

          約束指對(duì)簡(jiǎn)單類型的元素或?qū)傩允┘拥闹导s束條件,主要包含范圍約束、長(zhǎng)度約束、枚舉值、模式匹配、空白處理等,是XSD元素或?qū)傩灾迪拗频幕A(chǔ)。

          (1)       范圍約束

          范圍約束主要施加到數(shù)值型、日期型等類型,限制取值的范圍。如:

          <xs:restriction base="xs:integer">
                  <xs:minInclusive value="0"/>
                  <xs:maxInclusive value="120"/>
              </xs:restriction>

          上述范圍約束限定的取值范圍是:0<=值<=120。

          其他的值范圍約束元素主要包括:

          l         fractionDigits 設(shè)置最大小數(shù)位數(shù)

          l         totalDigits 指定精確的數(shù)值位數(shù)

          l         maxExclusive 設(shè)置數(shù)值型的最大值(val < xxx)

          l         maxInclusive 設(shè)置數(shù)值型的最大值(val <= xxx)

          l         minExclusive 設(shè)置數(shù)值型的最小值(val > xxx)

          l         minInclusive 設(shè)置數(shù)值型的最小值(val >= xxx)

          (2)       長(zhǎng)度約束

          長(zhǎng)度約束施加到任何類型上限制值的長(zhǎng)度,包括<xs:length>固定長(zhǎng)度、<xs:maxLength>最大長(zhǎng)度、<xs:minLength>最小長(zhǎng)度三個(gè)限定元素。如:

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

              <xs:length value="8"/>

          </xs:restriction>

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

              <xs:minLength value="5"/>

              <xs:maxLength value="8"/>

          </xs:restriction>

          (3)       枚舉值約束

          枚舉值約束限制元素或?qū)傩缘闹抵荒茉诮o定的值列表中取值,并使用base屬性指示值的數(shù)據(jù)類型。如:

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

              <xs:enumeration value="CNY"/>

              <xs:enumeration value="USD"/>

              <xs:enumeration value="JPY"/>

          </xs:restriction>

          (4)       模式匹配約束

          模式匹配約束限制元素或?qū)傩缘闹祽?yīng)滿足給定的模式要求,并使用base屬性指示值的數(shù)據(jù)類型。如:

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

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

          </xs:restriction>

          以下是些模式匹配的示例:

          l         [a-z] a-z間的單個(gè)字符;

          l         [A-Z][A-Z] 兩個(gè)字符,每個(gè)字符都在A-Z間;

          l         [a-zA-Z] a-z或A-Z間的單個(gè)字符;

          l         [abc] 單個(gè)字符 a或b或c;

          l         ([a-z])* 零個(gè)或任意個(gè)字符a-z;

          l         ([a-z][A-Z])+ 一個(gè)或任意個(gè)字符對(duì),每對(duì)字符大小寫間隔出現(xiàn);

          l         "a"|"b" 值只能是a或b,與枚舉類似;

          l         [a-zA-Z0-9]{8} 精確的八個(gè)a-z或A-Z或0-9間的字符。

          (5)       空白處理約束

          空白處理約束限制XML文檔解析器如何處理值的組成空白字符,使用<xs:whitespace>限定元素指示。如:

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

              <xs:whiteSpace value="replace"/>

          </xs:restriction>

          value可能的取值包括:

          l         replace 刪除內(nèi)容中的全部空白;

          l         preserve 保留內(nèi)容中的全部空白;

          l         collapse 刪除前導(dǎo)、后導(dǎo)空白,替換內(nèi)容中的一個(gè)或多個(gè)空白為一個(gè)空格;

          6.3    屬性

          屬性本身總是定義為簡(jiǎn)單類型的。屬性可以指定缺省值、固定值、強(qiáng)制項(xiàng)、約束等屬性。屬性定義格式是:<xs:attribute name="xxx" type="ttt" [default="ddd"] [fixed="fff"] [use="required"] >

          如:

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

              <xs:attribute name="orderid" >

                 <xs:simpleType name="orderIdType">

                     <xs:restriction base="string">

                        <xs:pattern value="[A-Z]"d{8}" />

                     </xs:restriction>

                 </xs:simpleType>

              </xs:attribute>

          <xs:attribute name="orderid" type="orderIdType" />

              <xs:simpleType name=" orderIdType">

                  <xs:restriction base="string">

                      <xs:pattern value="[A-Z]"d{8}" />

               </xs:restriction>

          </xs:simpleType>

          6.4    空元素描述

          空元素通常使用<xs:complexType>描述:

          <xs:element name="product">
              <xs:complexType>
                  <xs:attribute name="prodid" type="xs:positiveInteger"/>
              </xs:complexType>
          </xs:element>

          或使用<xs:simpleContent>描述,這種格式通常在元素包含屬性和文本時(shí)使用。

          <xs:element name="product">
              <xs:complexType>
                  <xs:simpleContent>
                      <xs:restriction base="xs:integer">
                           <xs:attribute name="prodid" type="xs:positiveInteger"/>
                      </xs:restriction>
                  </xs:simpleContent>
              </xs:complexType>
          </xs:element>

          或者使用分離結(jié)構(gòu)描述。

          6.5    只包含子元素的元素描述

          <xs:element name="name">

              <xs:complexType>

                  <xs:sequence>

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

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

                  </xs:sequence>

              </xs:complexType>

          </xs:element>

          或使用分離結(jié)構(gòu)描述。

          6.6    只包含text的元素描述

          Text總是基本類型或簡(jiǎn)單類型的,因此其描述使用擴(kuò)展基本類型。

          <xs:element name="somename">

              <xs:complexType>

                  <xs:simpleContent>

                      <xs:extension base="basetype">

                      ...

                      </xs:extension>

                 </xs:simpleContent>

              </xs:complexType>

          </xs:element>

          使用<xs:extension>擴(kuò)展基本類型;

          或:

          <xs:element name="somename">

              <xs:complexType>

                  <xs:simpleContent>

                      <xs:restriction base="basetype">

                      ...

                      </xs:restriction>

                  </xs:simpleContent>

               </xs:complexType>

          </xs:element>

          使用xs:restriction 擴(kuò)展類型。

          如果元素包含屬性和文本,則描述格式如下:

          <xs:element name="shoesize">

              <xs:complexType>

                  <xs:simpleContent>

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

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

                      </xs:extension>

                  </xs:simpleContent>

              </xs:complexType>

          </xs:element>

          6.7    混合結(jié)構(gòu)的元素描述

          如果子元素間夾雜了text,則text總被認(rèn)為是xs:string的,因此只需描述子元素的組成,并使用mixed="true"指示本元素是混合結(jié)構(gòu)的元素。如下列描述:

          .xml

          <letter>
              Dear Mr.<name>John Smith</name>:
                  Your order <orderid>1032</orderid>will be shipped on <shipdate>2001-07-13</shipdate>.

                      Thanks.
          </letter>

          .xsd

          <xs:element name="letter">
                  <xs:complexType mixed="true">
                     <xs:sequence>
                             <xs:element name="name" type="xs:string"/>
                              <xs:element name="orderid" type="xs:positiveInteger"/>
                              <xs:element name="shipdate" type="xs:date"/>
                         </xs:sequence>
                     </xs:complexType>
          </xs:element>

          6.8    類型擴(kuò)展

          XSD使用<xs:extension>擴(kuò)展一個(gè)基本類型、簡(jiǎn)單類型或復(fù)雜類型。擴(kuò)展簡(jiǎn)單類型主要是增加附加的一些約束,擴(kuò)展復(fù)雜類型則可以增加新的組成元素或?qū)傩浴H纾?/p>

          (1)基本類型擴(kuò)展

              <xs:complexType>

                  <xs:simpleContent>

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

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

                      </xs:extension>

                  </xs:simpleContent>

              </xs:complexType>

          (2)復(fù)雜類型擴(kuò)展

          <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:extension base="personinfo">

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

          對(duì)復(fù)雜類型進(jìn)行擴(kuò)展,使用<xs:complexContent>,對(duì)簡(jiǎn)單類型進(jìn)行擴(kuò)展使用<xs:simpleContent>。

          6.9    復(fù)雜類型指令

          復(fù)雜類型指令控制子元素如何在復(fù)雜元素中使用,包括三類指令:順序、次數(shù)、分組。

          (1)       順序

          順序指令控制子元素是否按順序出現(xiàn),包含三種類型:

          l         <xs:all>

          指示這些子元素最多出現(xiàn)一次,且順序無(wú)關(guān)(minOccurs=0,maxOccurs=1)。

          <xs:complexType name="fullpersoninfo">

              <xs:all>

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

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

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

              </xs:all>

          </xs:complexType>

          l         <xs:sequencs>

          指示這些子元素必須按順序出現(xiàn)。

          <xs:complexType name="fullpersoninfo">

              <xs:sequencs>

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

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

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

              </xs:sequence>

          </xs:complexType>

          l         <xs:choice>

              指示這些子元素只能出現(xiàn)其中一個(gè)。

          <xs:complexType name="fullpersoninfo">

              <xs:choice>

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

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

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

              </xs:choice>

          </xs:complexType>

          (2)       次數(shù)

          次數(shù)指令作為元素的屬性,控制元素可以出現(xiàn)的次數(shù),包含兩個(gè)指令:minOccurs、maxOccurs。如:<element name="B2C" type="string" minOccurs="3" maxOccurs="4"></element>

          (3)      

          組指令指示一個(gè)元素或?qū)傩约稀?/p>

          元素組使用<xs:group name="xxx">嵌套一個(gè)all、choice、sequence指令;定義后,使用<xs:group ref="name">引用元素組。

          屬性組使用<xs:attributeGroup name="xxx">嵌套多個(gè)<attribute>屬性定義。定義后,使用<xs:attributeGroup ref="name">引用屬性組。

          復(fù)雜類型還可以使用一些特殊的標(biāo)記擴(kuò)展文檔。

          l         <xs:any minOccurs = "0" > 指示可以在此位置包含任何其他元素;(這些元素也必須在Schema文檔中進(jìn)行定義)

          l         <xs:anyAttribute> 指示可以在此位置包含任何其他的屬性。(這些屬性也必須在Schema文檔中進(jìn)行定義)

          6.10              置換組

          置換組可以根據(jù)用戶需要選擇使用一組元素,其實(shí)際的效果相當(dāng)于給一個(gè)元素取了一個(gè)別名。如:

          <xs:element name="name" type="xs:string"/>
          <xs:element name="navn" substitutionGroup="name"/>

          navn是name的置換,因此文檔中使用<name>的位置均可以使用<navn>且<navn>的類型和<name>類型一致。

          如果想禁止置換某個(gè)元素,可以在定義元素時(shí)使用 block="substitution" 屬性。

          置換元素和被置換元素必須是全局元素。所謂全局元素就是<xs:schema>元素的直接子元素。嵌套在全局元素中的元素稱為本地元素。(因此,復(fù)雜類型定義中總是使用<xs:element ref="name"/>的形式引用全局元素)

          6.11              最佳實(shí)踐

          (1)將可能被共享的元素創(chuàng)建為全局基本元素;(或?qū)⑷吭貏?chuàng)建為全局元素);

          (2)根據(jù)各元素的類型創(chuàng)建全局的類型,并設(shè)置必要的約束;

          (3)組合(引用)全局基本元素形成元素集合(復(fù)雜類型);

          (4)組合復(fù)雜類型為最終的模型。

          使用這種模式,適合大型項(xiàng)目,可以共享大量的元素定義,但缺點(diǎn)是由于共享大量的元素定義,可能導(dǎo)致模型比較復(fù)雜。

          7          實(shí)例

          下面我們對(duì)給定的xml建模其xsd文檔,使用的工具是myEclipse。

          .xml

          <?xml version="1.0" encoding="ISO-8859-1"?>

          <shiporder orderid="889923"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:noNamespaceSchemaLocation="shiporder.xsd">

                   <orderperson>John Smith</orderperson>

                   <shipto>

                      <name>Ola Nordmann</name>

                      <address>Langgt 23</address>

                      <city>4000 Stavanger</city>

                      <country>Norway</country>

                   </shipto>

                   <item>

                      <title>Empire Burlesque</title>

                      <note>Special Edition</note>

                      <quantity>1</quantity>

                      <price>10.90</price>

                   </item>

                   <item>

                      <title>Hide your heart</title>

                      <quantity>1</quantity>

                      <price>9.90</price>

                   </item>

          </shiporder>

          (1)       整理文檔的基本格式要求:

          l         沒(méi)有使用名空間;

          l         根元素是shiporder;

          l         shiporder有一個(gè)屬性orderid,類型是整型的;

          l         shiporder有三個(gè)子元素:

          n         orderperson 是字符串型的;

          n         shipto是個(gè)復(fù)雜類型的,且只能出現(xiàn)一次;

          n         item是復(fù)雜類型的,可以出現(xiàn)1次或多次;

          l         shipto有四個(gè)子元素:

          n         name是字符串型的;

          n         address是字符串型的;

          n         city是字符串型的;

          n         country是字符串型的;

          l         item有三個(gè)子元素:

          n         title是字符串型的;

          n         quantity是整型的;

          n         price是數(shù)值型的。

          (2)       創(chuàng)建全部元素、屬性為全局元素、


               
              (3)創(chuàng)建各自定義類型的描述;由于我們將全部元素均創(chuàng)建為全局元素,因此在創(chuàng)建類型的組成元素時(shí),我們均創(chuàng)建為對(duì)全局元素的引用。另外,注意指定組成元素的出現(xiàn)次數(shù)。





          (4)       修改xsd的名空間;

          (5)       最終形成的文檔如下:

          <?xml version="1.0" encoding="UTF-8"?>

          <xsd:schema elementFormDefault="qualified"

              xmlns:xsd="http://www.w3.org/2001/XMLSchema">

          <!-- 元素建模 -->

              <xsd:element name="shiporder" type="shiporderType"></xsd:element>

              <xsd:element name="orderperson" type="xsd:string"></xsd:element>

              <xsd:element name="shipto" type="shiptoType"></xsd:element>

              <xsd:element name="name" type="xsd:string"></xsd:element>

              <xsd:element name="address" type="xsd:string"></xsd:element>

              <xsd:element name="city" type="xsd:string"></xsd:element>

              <xsd:element name="country" type="xsd:string"></xsd:element>

              <xsd:element name="title" type="xsd:string"></xsd:element>

              <xsd:element name="quantity" type="xsd:int"></xsd:element>

              <xsd:element name="price" type="xsd:decimal"></xsd:element>

              <xsd:element name="item" type="itemType"></xsd:element>

          <!-- 屬性建模 -->

              <xsd:attribute name="orderid" type="xsd:long"></xsd:attribute>

          <!-- 類型建模 -->

              <xsd:complexType name="shiporderType">

                 <xsd:sequence>

                     <xsd:element ref="orderperson"></xsd:element>

                     <xsd:element ref="shipto" minOccurs="1" maxOccurs="1"></xsd:element>

                     <xsd:element ref="item" minOccurs="1"

                        maxOccurs="unbounded">

                     </xsd:element>

                 </xsd:sequence>

                 <xsd:attribute ref="orderid"></xsd:attribute>

              </xsd:complexType>

              <xsd:complexType name="shiptoType">

                 <xsd:sequence>

                     <xsd:element ref="name"></xsd:element>

                     <xsd:element ref="address"></xsd:element>

                     <xsd:element ref="city"></xsd:element>

                     <xsd:element ref="country"></xsd:element>

                 </xsd:sequence>

              </xsd:complexType>

              <xsd:complexType name="itemType">

                 <xsd:sequence>

                     <xsd:element ref="title"></xsd:element>

                     <xsd:element ref="quantity"></xsd:element>

                     <xsd:element ref="price"></xsd:element>

                 </xsd:sequence>

              </xsd:complexType>

          </xsd:schema>

          注意:xsd中,xmlns:xsd="http://www.w3.org/2001/XMLSchema"指示全部引用XSD標(biāo)準(zhǔn)定義的名稱使用xsd作為前綴,而前面文章描述中我們使用的前綴是xs,這個(gè)差異是工具形成的,都是合法的,甚至我們可以定義前綴是任何我們想要的,換句話說(shuō)xs并非強(qiáng)制要求的前綴。

          posted on 2008-02-13 21:02 飛鷹 閱讀(2614) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 娄底市| 溧阳市| 苗栗市| 婺源县| 江西省| 得荣县| 阿克| 惠安县| 青铜峡市| 龙井市| 英山县| 达州市| 丘北县| 从江县| 芷江| 太原市| 大洼县| 鄂伦春自治旗| 西吉县| 台中县| 长寿区| 台前县| 舞阳县| 武平县| 西吉县| 大渡口区| 石台县| 隆尧县| 彝良县| 南澳县| 江阴市| 吴旗县| 阿鲁科尔沁旗| 贵港市| 尚志市| 莱西市| 石首市| 吴旗县| 新巴尔虎左旗| 乐陵市| 呼图壁县|