XML Schema学习总结

简单类型
1.简单元素:指只能包含文本内容,不能够包含子元素,也没有属性的元素
格式:<xs:element name="xxx" type="yyy"/>
例子:
<xs:element name="name" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="gender" type="xs:boolean"/>
2.属性:所有的元素属性均被声明为简单类型。只有复杂类型的元素才可以拥有属性
格式:<xs:attribute name="xxx" type="yyy"/>
例子:<xs:attribute name="lang" type="xs:string"/>
所有的属性默认都是可选的,我们可以通过使用use关键字明确的指出是可选或是必需:
<xs:attribute name="lang" type="xs:string" use="optional"/>
<xs:attribute name="lang" type="xsLstring" use="required"/>
我们可以通过使用default或fixed为简单类型(简单元素、属性)指定默认值或固定值
如下:
<xs:element name="color" type="xs:string" default="red"/>
<xs:attribute name="lang" type="xs:string" fixed="CN"/>
对简单类型的约束:
约束                                              含义
enumeration                         定义允许值的枚举
fractionDigits                       指定最多允许的小数位数(必须大于或等于零)
length                                  精确指定允许的最大字符长度
maxExclusive                       指定允许的最大数值,必须小于该值
maxInclusive                        指定允许的最大数值,必须小于或等于该值
maxLength                           指定允许的最大字符长度(必须大于等于零)
minExclusive                        指定允许的最小数值,必须大于该值
minInclusive                         指定允许的最小数值,必须大于或等于该值
minLength                           指定允许的最小字符长度
pattern                                指定允许值的模式,类似正则表达式
totalDigits                            精确指定数字个数
whiteSpace                          处理空白(保留:preserve;替换:replace;合并:collapse)
复杂类型
复杂类型指包含其他元素/属性的元素类型
<message>
             <to>rose</to>
            <from>alex</from>
            <body>Hi,My Girl!</body>
</message>
在上面的例子中,元素message就是一个复杂类型的元素,我们在Schema中这样描述:
<xs:element name="message">
                <xs:complexType>
                             <xs:sequence>
                                          <xs:element name="to" type="xs:string"/>
                                           <xs:element name="from" type="xs:string"/>
                                          <xs:element name="body" type="xs:string"/>
                            </xs:sequence>
                </xs:complexType>
</xs:element>
注意:元素to,from,body包含在<xs:sequence></xs:sequence>中,表明这些元素必须按照定义的顺序出现在你的XML文件中。
当然,message元素也可以包含一个type属性,指向我们定义的复杂类型,像这样:
 <xs:complexType name="msg">
                             <xs:sequence>
                                          <xs:element name="to" type="xs:string"/>
                                           <xs:element name="from" type="xs:string"/>
                                          <xs:element name="body" type="xs:string"/>
                            </xs:sequence>
 </xs:complexType>
<xs:element name="message" type="msg"/>

复杂类型和简单类型之间最根本的区别就是:复杂类型的内容中可以包含其他元素,也可以带有属性(Attribute),但简单类型既不能包含子元素,也不能带有任何属性



1.如何描述空元素,比如:<product prodid="1345"/>?
因为是空元素,所以不包含子元素,同时由于包含属性,用attribute定义,象这样:
<xs:element name="product">
          <xs:complexType>
                     <xs:attribute name="prodid" type="xs:positiveInteger"/>
         </xs:complexType>
</xs:element>
也可以这样:
<xs:element name="product" type="productType"/>
<xs:complexType name="productType">
           <xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>

2.如何描述只含有简单内容(文本/属性)的元素,比如:
<message date="2006-06-26">Hi,My Girl</message>?
由于只包含简单内容,所以我们在元素内容定义的外面用simpleContent指出,当描述简单内容的时候,我们需要在简单内容里使用extension或者restriction来描述内容的数据类型。象这样:
<xs:element name="message">
      <xs:complexType>
                 <xs:simpleContent>
                                <xs:extension base="xs:string">
                                         <xs:attribute name="date" type="xs:date"/>
                                </xs:extension>
                  </xs:simpleContent>
      </xs:complexType>
</xs:element>
其中message的属性date的数据类型为日期(xs:date).
顺便提一下:XML Schema中常用的数据类型有:
xs:string、xs:decimal、xs:integer、xs:boolean、xs:date、xs:time等

3、如何定义混合类型,比如:
<message>
             This message comes from<from>Alex</from>
</message>
message元素除了包含子元素from之外,还直接包含文本"This message comes from"。对于这种情况,我们需要在complexType中使用属性mixed="true"指出。以下是Schema:
<xs:element name="message">
         <xs:complexType mixed="true">         //表示即有子元素又可以有文本
                <xs:element name="from" type="xs:string"/>
        </xs:complexType>
</xs:element>
当然,如果包含更多的子元素,我们可以需要使用<xs:sequence>来限定那些子元素的顺序。
在XML Schema中,有3类共7种指示器(indicator):

一、定义元素如何出现:包括all,sequence,choice这三个。
1、all:默认值。不限制子元素的出现顺序,每个子元素必须出现且只能出现一次。例如:
<xs:element name="person">
              <xs:complexType>
                        <xs:all>
                              <xs:element name="firstname" type="xs:string"/>
                              <xs:element name="lastname" type="xsL:string"/>  
                        </xs:all>
              </xs:complexType>
</xs:element>
2.sequence:子元素在XML文件中按照XML Schema定义的顺序出现。
3、choice:两个或多个子元素中仅出现一个。例如:
<xs:element name="gender">
              <xs:complexType>
                        <xs:choice>
                              <xs:element name="male" type="male"/>
                              <xs:element name="female" type="female"/>  
                        </xs:choice>
              </xs:complexType>
</xs:element>
二、次数限定类,包括minOccurs和maxOccurs,前者指定最少出现次数,后者指定最多出现次数。例如:
<xs:element name="person">
           <xs:complexType>
                      <xs:sequence>
                                  <xs:element name="full_name" type="xs:string"/>
                                  <xs:element name="child_name" type="xs:string" maxOccurs="10" minOccurs="0"/>
                      </xs:sequence>
           </xs:complexType>
</xs:element>
如果元素出现的最大次数无限制,可以使用maxOccurs="unbounded".
三、组限定:包括Group和attributeGroup,用来定义一组相关的元素。比如:
<xs:group name="persongroup">         //group元素组
        <xs:sequence>
                    <xs:element name="firstname" type="xs:string"/>
                    <xs:element name="lastname" type="xs:string"/>
                    <xs:element name="birthday" type="xs:date"/>
        </xs:sequence>
</xs:group>
-------------------------------------------------------------------------------------
<xs:attributeGroup name="personattrgrouop">        //属性组
                <xs:attribute name="firstname" type="xs:string"/>
                <xs:attribute name="lastname" type="xs:string"/>
                <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>
补充:<any>和<anyAttribute>,在XML Schema中使用这两件元素可以放宽Schema对XML文件内容的限制。容许我们在XML文件中使用没有在Schema中定义的元素和属性。(很少使用)
元素属性substitutionGroup可以让元素b替换a在XML文件中出现。比如:
<xs:element name="cn_name" type="xs:string"/>
<xs:element name="en_name" substitutionGroup="cn_name"/>
这种情形类似choice:
<xs:choice>
           <xs:element name="cn_name" type="xs:string"/>
            <xs:element name="en_name" type="xs:string">
</xs:choice>

[实验目的] 1、安装并学习如何使用XMLSPY集成开发环境完成XML相关的开发工作。 2、熟悉和掌握XML规范的基本内容,包括XML声明、注释、处理指令、元素、属性、CDATA段、预定义实体、命名空间的使用,以及如何进行XML文档良构和有效性验证;能够灵活地使用XML层次数据来表示各种信息。 3、掌握如何在DTD文档中声明元素及其内容模型、属性,以及实体的声明和使用;使用内部/外部DTD规则,对XML数据文档的有效性进行约束。 [实验内容和步骤] 1、安装XMLSPY集成开发环境,新建XML、DTD文档,在各种不同的编辑视图中尝试采用不同的方式完成XML文档的编辑和查看;并使用XMLSPY提供的便利,建立XML、DTD两者之间的关联,进行XML文档的良构以及有效性验证。 2、附件中提供了一个名为SpyBase的Excel文件,其中包含Alias、Mission和Spy三张数据表,请分别完成下列任务: ①.使用一个XML文档(SpyBase1.xml)来描述其中包含的所有信息,基本保持原有数据的形式(不要将三个表中的数据进行嵌套)。请使用XML文档的Grid视图完成该文档的编写(需使用Grid视图中提供的表操作工具条),并验证文档的良构性。结果示例如下图所示(该图仅供参考,要求对aID、mID、spyID必须使用XML属性,其他字段使用XML元素): ②.使用一个XML文档(SpyBase2.xml)来描述其中包含的所有信息,要求通过XML元素的正确嵌套消除数据之间的参照关系产生的冗余。请使用XML文档的Text或者Grid视图完成该文档的编写,并验证文档的良构性。 3、为第二步中得到的SpyBase1.xml、SpyBase2.xml分别编写相应的外部DTD文档,建立模式与数据之间的关联,并进行文档有效性验证。在编写的DTD文档中,要求在DTD文档中使用参数实体来替换所有的#PCDATA和CDATA。 [实验思考] 在本实验中发现,一个XML文档可以通过平面的形式、或者层次的形式来表示多个关系数据库中的二维表,那么哪种方式更合适,为什么? [提交时间及内容] 最后提交时间 2013年?月?日 提交内容 提交SpyBase1.xml、SpyBase2.xml。 提交SpyBase1.dtd、SpyBase2.dtd。
[实验目的] 1、学习如何使用XMLSPY集成开发环境完成XML Schema相关的开发工作。 2、掌握XML Schema与DTD之间的区别,能够完成两者之间的转换;掌握在XML Schema中如何定义元素和属性,如何使用限制、列表和合并派生自己的简单数据类型,如何定义复杂数据类型,全局/局部元素和数据类型之间的区别;如何将XML Schema文档关联到XML实例数据文档,并完成文档的有效性验证。 3、掌握如何准确定义数据之间的参照完整性约束,如何在模式中使用多态性支持,如何在文档中定义空值等等。 [实验内容和步骤] 1、使用XMLSPY集成开发环境,新建XML Schema文档,在各种不同的编辑视图中尝试采用不同的方式完成XML Schema文档的编辑和查看;并使用XMLSPY提供的便利,建立XMLSchema两者之间的关联,进行XML文档的良构以及有效性验证。 2、严格按照下图给出的文档模型,在XML Schema编辑环境的Schema视图中完成book.xsd的编写(不要使用Text视图进行编写): 在上图中,没有指定简单类型元素和属性的数据类型,请根据合理的情况,完成数据类型的创建(至少使用到限制方式中的三种以上的限制方面),请在IDE的Details视图->type和Facets中完成上述任务。 在上图中,有三个title元素分别表示book、section和figure的标题,请定义下述类型: titleType:1-100个字符的文本; bookTitleType:titleType类型限制派生的子类型,要求取枚举值“Data On the Web”、“TCP/IP Illustrated”等; sectionTitleType:titleType类型限制派生的子类型,要求必须形如“1.xxxx”、“1-1.xxxx”等等(表示第一节、第一节下面的第一节等等,注意section是递归的形式); figureTitleType:titleType类型限制派生的子类型,要求必须形如“1-1.xxxx” 、“1-1-1.xxxx”(表示第一节中的第一个图、第一节下面的第一节的第一个图等等); 然后编写book.xml,并使用多态性(即所有title的类型均为titleType,而数据实例中指明具体类型),请确保通过文档有效性验证。 3、在上次的DTD实验中,我们编写了SpyBase1.xml、SpyBase2.xml、以及SpyBase1.dtd和SpyBase2.dtd,这次需要完成SpyBase1.xsd和SpyBase2.xsd,建立模式与数据之间的关联,并进行文档有效性验证。在编写的XSD文档SpyBase1.xsd中,要求使用key/keyref描述数据的实体完整性以及数据之间的参照完整性(SpyBase2.xml不需要,因为已经使用嵌套消除了参照关系)。 [实验思考] 与ID/IDREF相比,key/keyref有哪些优点,在使用上有何不同? 假设SpyBase1.xml中的alias、mission、spy来自不同的命名空间中,如何在Schema中对其进行限定,请在XMLSPY中完成相应的xsd文档?修改SpyBase1.xml,并验证新的SpyBase1_2.xsd是否正确? [提交时间及内容] 最后提交时间 2013年?月?日 提交内容 提交book.xsd、book.xml(使用多态)。 提交SpyBase1. xsd、SpyBase2. xsd。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值