zoukankan      html  css  js  c++  java
  • W3C XML Schema 教程

    XML SCHEMA教程

    本教程是笔者学习W3C的《XML Schema Tutorial》的笔记。如果你对原教程感兴趣,可以浏览http://www.w3schools.com/schema/default.asp

    XML Schema是W3C制定的基于XML格式的XML文档结构描述标准。作为一种文档描述语言,通常我们将其简写为XSD(XML Schema Define)。XSD作为DTD(文档类型定义)的替代者,已经广泛地应用到各种商业应用。使用XSD,我们不仅可以描述XML文档的结构以便颁布业务标准,而且可以使用支持XSD的通用化XML解析器对XML文档进行解析并自动地检查其是否满足给定的业务标准。应用XSD校验XML文档的结构后,我们不仅验证了XML文档的有效性(Well-Formed Document),还验证了XML文档的合法性,甚至验证了XML文档各域的值合法性(数据类型与编码值),而且这些验证工作不必我们编写任何代码,只需使用支持XSD的通用化XML文档解析器即可完成。这就给应用软件带来了巨大的灵活性,以前需要借助数据库或配置文件才能完成的参数化管理,现在只需按照新的业务需求发布新的XML Schema即可。

    作为一个入门,下面列出一个XML文档及其XSD文档,使我们对XSD有个简单的认识:

    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>

    说明如下:

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

    XML文档定义,描述本文档使用的XML标准版本及文档编码标准。

    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,即没有前缀的元素、属性、类型等名称是属于该名空间的。

    l         elementFormDefault="qualified" 指示使用本XSD定义的XML文档所使用的元素必须在本文档中定义且使用名空间前缀。

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

        定义一个元素,该元素的名称是note,即XML中的<note>;

    (4)<xs:complexType>

        <note>元素的类型是复杂类型,具体格式由子元素定义;

    (5)<xs:sequence>

        <note>元素的子元素必须按顺序出现。具体的顺序由子元素的定义顺序决定;

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

         定义一个元素<to>,其类型是string,且其是<note>的第1个子元素;

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

         定义一个元素<from>,其类型是string,且其是<note>的第2个子元素;

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

         定义一个元素<heading>,其类型是string,且其是<note>的第3个子元素;

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

         定义一个元素<body>,其类型是string,且其是<note>的第4个子元素;

    上面的说明可以看出我们描述的XML文档应满足这些要求:根元素是<note>;<note>可以包含四个子元素,分别是<to>、<from>、<heading>、<body>,且必须按<to>、<from>、<heading>、<body>的顺序出现;四个子元素都是string类型的。

    1          格式良好文档

    满足下列要求的XML文档,称为格式良好的文档(Well-Formed Document):

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

    (2)       文档仅包含一个唯一的根元素;

    (3)       起始标记(<xxx>)必须与结束标记(</xxx>)匹配;

    (4)       大小写敏感;

    (5)       所有元素是闭合的(<必须与>配套);

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

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

    (8)       entities must be used for special characters

    应注意到,满足上述要求的文档只能算是有效的文档,但不能算是合法的文档。例如,业务标准要求文档中必须包含5个<SEG>元素,如果文档中仅包含了4个,它仍是格式良好的文档,但不满足业务标准要求,是一个非法的文档。

    2          XSD应用的场合

    (1)       定义文档中可以出现的元素;

    (2)       定义文档中可以出现的属性;

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

    (4)       定义元素出现的顺序;

    (5)       定义元素出现的次数;

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

    (7)       定义元素与属性的数据类型;

    (8)       定义元素与属性的缺省值或固定值或值范围、值列表。

    3          XSD相对于 DTD的优势

    (1)XSD支持数据类型;

    l         易于描述许可的文档组成;

    l         易于校验数据的合法性;

    l         易于使用数据库中的数据;

    l         易于定义数据的约束;

    l         易于定义数据的模式;

    l         易于在不同数据类型间进行格式转换

    (2)XSD使用XML语法;

    (3)XSD使数据交换更安全,因为它描述了数据的格式,避免了歧义;

    (4)XSD可以扩展,支持类型的扩展和结构的扩展。

    4          文档引用

    XSD支持名空间(NameSpace)和文档引用。通过名空间,可以避免文档引用中可能导致的名称重复问题。W3C规定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" 指示本文档缺省的名空间,即没有前缀的所有的元素应在该空间中定义;

    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。如果要引用多个名空间的XSD文档,则使用空格分隔多个‘Namespace xsd’对。例如:http://www.acom.com a.xsd http://www.bcom.com b.xsd...。如果XSD文档没有使用名空间,则使用xsi:noNamespaceSchemaLocation="note.xsd"代替xsi:schemaLocation。

    5          简单元素描述

    简单元素指只包含text的XML元素,它没有任何子元素或属性,如:<sex>男</sex>。简单元素可以附加地定义其缺省值或固定值。XSD定义简单元素的格式是:<xs:element name="xxx" type="ttt" [default="defval"] [fixed="fixedval"]>。其中ttt使用XSD标准定义的基本类型,即:xs:string、xs:decimal、xs:integer、xs:boolean、xs:date、 xs:time等。例如:<xs:element name=sex type=xs:string default=>。

    使用上述方式定义的简单元素只能限定元素的数据类型、缺省值、固定值。如果希望限定该简单元素的取值范围等约束,则应使用简单类型定义,并在简单类型中嵌套值约束子元素。如:

    <xs:element name="sex">

    <xs:simpleType>

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

    <xs:enumeration value="男"/>

    <xs:enumeration value="女"/>

    </xs:restriction>

    </xs:simpleType>

    </xs:element>

    其中,约束的定义方式参考第6节。

    6          复杂元素描述

    复杂元素指包含属性或子元素的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>

    复杂元素是一种复杂类型,可以使用下面两种描述方式,一是复合结构,二是分离结构。复合结构,则直接将复杂类型定义为复杂元素的子元素;分离结构则是将复杂类型定义在外部,由复杂元素引用。

    l         复合结构

    <xs:element name="xxx">

    <xs:complexType>

        ...

            </xs:complexType>

    </xs:element>

    l         分离结构

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

    <xs:complexType name=”yyy”>

        ...

        </xs:complexType>

    这两种描述结构也适合于属性、简单元素的描述。如果XSD元素中存在大量可复用的自定义数据类型时,建议使用分离式的定义结构。

    6.1    数据类型

    XSD的数据类型包括基本数据类型、简单数据类型、复杂数据类型三类。基本数据类型指W3C标准定义的数据类型,主要包括xs:integer、xs:string、xs:date、xs:boolean等。简单数据类型是基本数据类型的扩展,对取值进行约束;复杂数据类型则是一个复杂的数据结构,通常包含了属性或子元素定义。

    (1)       简单类型

    简单类型扩展基本数据类型,并对值施加一定的约束。如:

        <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)       复杂类型

    复杂类型通常是复杂元素的数据类型或复杂元素的子元素,描述复杂元素的子元素、属性以及子元素与属性的类型。参看后续各小节的描述。

    6.2    约束

    约束指对简单类型的元素或属性施加的值约束条件,主要包含范围约束、长度约束、枚举值、模式匹配、空白处理等,是XSD元素或属性值限制的基础。

    (1)       范围约束

    范围约束主要施加到数值型、日期型等类型,限制取值的范围。如:

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

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

    其他的值范围约束元素主要包括:

    l         fractionDigits 设置最大小数位数

    l         totalDigits 指定精确的数值位数

    l         maxExclusive 设置数值型的最大值(val < xxx)

    l         maxInclusive 设置数值型的最大值(val <= xxx)

    l         minExclusive 设置数值型的最小值(val > xxx)

    l         minInclusive 设置数值型的最小值(val >= xxx)

    (2)       长度约束

    长度约束施加到任何类型上限制值的长度,包括<xs:length>固定长度、<xs:maxLength>最大长度、<xs:minLength>最小长度三个限定元素。如:

    <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)       枚举值约束

    枚举值约束限制元素或属性的值只能在给定的值列表中取值,并使用base属性指示值的数据类型。如:

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

        <xs:enumeration value="CNY"/>

        <xs:enumeration value="USD"/>

        <xs:enumeration value="JPY"/>

    </xs:restriction>

    (4)       模式匹配约束

    模式匹配约束限制元素或属性的值应满足给定的模式要求,并使用base属性指示值的数据类型。如:

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

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

    </xs:restriction>

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

    l         [a-z] a-z间的单个字符;

    l         [A-Z][A-Z] 两个字符,每个字符都在A-Z间;

    l         [a-zA-Z] a-z或A-Z间的单个字符;

    l         [abc] 单个字符 a或b或c;

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

    l         ([a-z][A-Z])+ 一个或任意个字符对,每对字符大小写间隔出现;

    l         "a"|"b" 值只能是a或b,与枚举类似;

    l         [a-zA-Z0-9]{8} 精确的八个a-z或A-Z或0-9间的字符。

    (5)       空白处理约束

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

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

        <xs:whiteSpace value="replace"/>

    </xs:restriction>

    value可能的取值包括:

    l         replace 删除内容中的全部空白;

    l         preserve 保留内容中的全部空白;

    l         collapse 删除前导、后导空白,替换内容中的一个或多个空白为一个空格;

    6.3    属性

    属性本身总是定义为简单类型的。属性可以指定缺省值、固定值、强制项、约束等属性。属性定义格式是:<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>描述,这种格式通常在元素包含属性和文本时使用。

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

    或者使用分离结构描述。

    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>

    或使用分离结构描述。

    6.6    只包含text的元素描述

    Text总是基本类型或简单类型的,因此其描述使用扩展基本类型。

    <xs:element name="somename">

        <xs:complexType>

            <xs:simpleContent>

                <xs:extension base="basetype">

                ...

                </xs:extension>

           </xs:simpleContent>

        </xs:complexType>

    </xs:element>

    使用<xs:extension>扩展基本类型;

    或:

    <xs:element name="somename">

        <xs:complexType>

            <xs:simpleContent>

                <xs:restriction base="basetype">

                ...

                </xs:restriction>

            </xs:simpleContent>

         </xs:complexType>

    </xs:element>

    使用xs:restriction 扩展类型。

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

    <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    混合结构的元素描述

    如果子元素间夹杂了text,则text总被认为是xs:string的,因此只需描述子元素的组成,并使用mixed="true"指示本元素是混合结构的元素。如下列描述:

    .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    类型扩展

    XSD使用<xs:extension>扩展一个基本类型、简单类型或复杂类型。扩展简单类型主要是增加附加的一些约束,扩展复杂类型则可以增加新的组成元素或属性。如:

    (1)基本类型扩展

        <xs:complexType>

            <xs:simpleContent>

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

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

                </xs:extension>

            </xs:simpleContent>

        </xs:complexType>

    (2)复杂类型扩展

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

    对复杂类型进行扩展,使用<xs:complexContent>,对简单类型进行扩展使用<xs:simpleContent>。

    6.9    复杂类型指令

    复杂类型指令控制子元素如何在复杂元素中使用,包括三类指令:顺序、次数、分组。

    (1)       顺序

    顺序指令控制子元素是否按顺序出现,包含三种类型:

    l         <xs:all>

    指示这些子元素最多出现一次,且顺序无关(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>

    指示这些子元素必须按顺序出现。

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

        指示这些子元素只能出现其中一个。

    <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)       次数

    次数指令作为元素的属性,控制元素可以出现的次数,包含两个指令:minOccurs、maxOccurs。如:<element name="B2C" type="string" minOccurs="3" maxOccurs="4"></element>

    (3)      

    组指令指示一个元素或属性集合。

    元素组使用<xs:group name="xxx">嵌套一个all、choice、sequence指令;定义后,使用<xs:group ref="name">引用元素组。

    属性组使用<xs:attributeGroup name="xxx">嵌套多个<attribute>属性定义。定义后,使用<xs:attributeGroup ref="name">引用属性组。

    复杂类型还可以使用一些特殊的标记扩展文档。

    l         <xs:any minOccurs = "0" > 指示可以在此位置包含任何其他元素;(这些元素也必须在Schema文档中进行定义)

    l         <xs:anyAttribute> 指示可以在此位置包含任何其他的属性。(这些属性也必须在Schema文档中进行定义)

    6.10              置换组

    置换组可以根据用户需要选择使用一组元素,其实际的效果相当于给一个元素取了一个别名。如:

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

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

    如果想禁止置换某个元素,可以在定义元素时使用 block="substitution" 属性。

    置换元素和被置换元素必须是全局元素。所谓全局元素就是<xs:schema>元素的直接子元素。嵌套在全局元素中的元素称为本地元素。(因此,复杂类型定义中总是使用<xs:element ref="name"/>的形式引用全局元素)

    6.11              最佳实践

    (1)将可能被共享的元素创建为全局基本元素;(或将全部元素创建为全局元素);

    (2)根据各元素的类型创建全局的类型,并设置必要的约束;

    (3)组合(引用)全局基本元素形成元素集合(复杂类型);

    (4)组合复杂类型为最终的模型。

    使用这种模式,适合大型项目,可以共享大量的元素定义,但缺点是由于共享大量的元素定义,可能导致模型比较复杂。

    7          实例

    下面我们对给定的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         没有使用名空间;

    l         根元素是shiporder;

    l         shiporder有一个属性orderid,类型是整型的;

    l         shiporder有三个子元素:

    n         orderperson 是字符串型的;

    n         shipto是个复杂类型的,且只能出现一次;

    n         item是复杂类型的,可以出现1次或多次;

    l         shipto有四个子元素:

    n         name是字符串型的;

    n         address是字符串型的;

    n         city是字符串型的;

    n         country是字符串型的;

    l         item有三个子元素:

    n         title是字符串型的;

    n         quantity是整型的;

    n         price是数值型的。

    (2)       创建全部元素、属性为全局元素、


         
        (3)创建各自定义类型的描述;由于我们将全部元素均创建为全局元素,因此在创建类型的组成元素时,我们均创建为对全局元素的引用。另外,注意指定组成元素的出现次数。



     

     


    (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标准定义的名称使用xsd作为前缀,而前面文章描述中我们使用的前缀是xs,这个差异是工具形成的,都是合法的,甚至我们可以定义前缀是任何我们想要的,换句话说xs并非强制要求的前缀。

  • 相关阅读:
    查找第K小数
    比较奇偶数个数
    哈夫曼树练习
    数字转二进制数练习
    随笔
    字符串反码(练习)
    eclipse构建maven的web项目
    mysql中的一些操作语句,留存
    urllib2功能说明
    Python-第三方库requests详解
  • 原文地址:https://www.cnblogs.com/wangxiaoyang/p/3615442.html
Copyright © 2011-2022 走看看