新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> DTD, XML Schema(XMLS), RELAX NG
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 DTD/XML Schema 』 → 《XML、XML Schema、XSLT 2.0和XQuery开发详解》样章下载(感谢电子工业出版社博文视点提供) 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 19456 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 《XML、XML Schema、XSLT 2.0和XQuery开发详解》样章下载(感谢电子工业出版社博文视点提供) 举报  打印  推荐  IE收藏夹 
       本主题类别: Description Logics | 样式表技术(XSL, XSLT, XSL-FO, CSS) | DOM    
     admin 帅哥哟,离线,有人找我吗?
      
      
      
      威望:9
      头衔:W3China站长
      等级:计算机硕士学位(管理员)
      文章:5255
      积分:18406
      门派:W3CHINA.ORG
      注册:2003/10/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给admin发送一个短消息 把admin加入好友 查看admin的个人资料 搜索admin在『 DTD/XML Schema 』的所有贴子 点击这里发送电邮给admin  访问admin的主页 引用回复这个贴子 回复这个贴子 查看admin的博客楼主
    发贴心情 《XML、XML Schema、XSLT 2.0和XQuery开发详解》样章下载(感谢电子工业出版社博文视点提供)

    【作  者】孙鑫 [同作者作品]
    【丛 书 名】 Java Web开发三部曲
    【出 版 社】 电子工业出版社     【书 号】 9787121077371
    【出版日期】 2009 年1月 【开 本】 16开 【页 码】 471     【版 次】1-1

    购买链接:http://www.china-pub.com/508879
    下载:

    第 4 章 XML Schema初窥

    本章要点

    ·    了解XML Schema推荐标准
    ·    掌握XML Schema和DTD的区别
    ·    掌握元素和属性的声明
    ·    理解元素和属性的类型
    ·    掌握简单类型和复杂类型的定义
    ·    掌握模式与名称空间
    ·    掌握在实例中引用模式文档
    ·    了解注解
    ·    使用XMLSpy编写模式文档

    XML Schema的作用与DTD一样,都是用于定义XML文档结构,并用于验证XML文档。但XML Schema的功能比DTD要强大得多,相应地也比DTD要复杂得多。

    这一章我们首先帮助读者梳理XML Schema的脉络,快速了解XML Schema的结构,以形成对XML Schema的一个整体印象。

    4.1   XML Schema推荐标准
    W3C于1998年开始制定XML Schema标准,2001年5月2日正式发布了XML Schema 1.0的第一版。2004年10月28日,W3C发布了XML Schema 1.0的第二版,该版本修正了第一版中的一些错误。本书依据的是XML Schema 1.0的第二版。

    XML Schema 1.0推荐标准包括三个部分,如下所示:

    * XML Schema Part 0: Primer Second Edition

    这一部分是XML Schema的非标准文档,它对XML Schema的功能提供了一个让人容易理解的描述,并给出了大量的示例和说明,其主要目的是为了帮助开发者快速掌握XML Schema语言来创建模式。

    该部分文档的网址是:http://www.w3.org/TR/xmlschema-0/

    * XML Schema Part 1: Structures Second Edition

    这一部分详述了XML Schema定义语言(XML Schema definition language,XSDL),描述了XSDL中用于定义XML文档结构和约束XML文档内容的大部分组件。该部分规范依赖于XML Schema Part 2: Datatypes。

    该部分文档的网址是:http://www.w3.org/TR/xmlschema-1/

    * XML Schema Part 2: Datatypes Second Edition

    这一部分定义了一个类型系统,描述了内置的数据类型和可用于限制它们的面(facet)。这部分是单独的文档,其他规范也可以使用它,而不需要包含所有的XML Schema。

    该部分文档的网址是:http://www.w3.org/TR/xmlschema-2/

    4.2   XML Schema文档一瞥
    XML Schema文档采用XML语法,因此XML的语法规则和命名约束也适用于XML Schema。实际上,你可以把XML Schema看成是XML定义的一种应用。

    使用XSDL(XML Schema definition language ,XML模式定义语言)编写的XML文档,称为模式文档。模式文档以schema元素作为根元素,文件的后缀名为“.xsd”。

    我们看一个最简单的模式文档,如例4-1所示。

    例4-1  simple.xsd

    <?xml version="1.0"?>       
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="root" type="xs:string"/>              
    </xs:schema>

    ① 模式文档本身也是XML文档,因此以XML声明开始。

    ② 模式文档以xs:schema作为根元素,标志模式定义的开始。XSDL中的元素都在http://www.w3.org/2001/XMLSchema名称空间中,因此必须在根元素上声明这个名称空间,并指定名称空间的前缀(通常是xs或者xsd),本例中指定的前缀为xs。

    ③ 使用XSDL中的xs:element元素来声明一个在XML文档中使用的元素,属性name指定元素的名字,属性type指定元素的类型,即指定元素内容的类型。在本例中,我们使用xs:element元素声明了root元素(name="root"),该元素的类型为字符串(type="xs:string")。

    一个符合例4-1所示的模式定义的XML文档如例4-2所示。

    例4-2  simple.xml

    <?xml version="1.0" encoding="GB2312"?>

    <root>欢迎访问程序员之家www.sunxin.org)</root>

    什么是Schema?

    在计算机软件中,Schema这个词在不同的应用中有不同的含义,可以翻译为:架构、结构、规则、模式等。在XML中,Schema指的是定义和描述XML文档的规则,翻译为模式。

    4.3   XML Schema与DTD的比较
    我们看例4-3所示的XML文档。

    例4-3  employee.xml

    <?xml version="1.0" encoding="GB2312"?>
    <employee sn="hr-01-001">
        <name>张三</name>
        <age>26</age>
        <email>zhangsan@sunxin.org</email>
    </employee>

    如果采用DTD来定义例4-3的XML文档的结构,则一个可能的DTD如例4-4所示。

    例4-4  employee.dtd

    <!ELEMENT employee (name,age,email)>        ①
    <!ELEMENT name (#PCDATA)>                   ②
    <!ELEMENT age (#PCDATA)>                    ③
    <!ELEMENT email (#PCDATA)>                  ④
    <!ATTLIST employee sn CDATA #REQUIRED>      ⑤

    这个DTD表示employee元素可以有三个子元素name、age和email,这三个子元素必须依次出现,它们的内容只能是字符数据。employee元素还有一个必需的属性sn,属性值为字符数据。

    如果我们想要在上述DTD定义的基础上进一步限制元素的内容,例如,限制age元素的内容只能是正整数,或者限制email元素的内容必须是有效的邮件格式,DTD就无能为力了。下面我们采用XML Schema来定义例4-3的XML文档的结构并约束文档的内容,如例4-5所示。

    例4-5  employee.xsd

    <?xml version="1.0" encoding="GB2312"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="employee" type="empType"/>                    
        <xs:complexType name="empType">                                 
            <xs:sequence>                                               
                <xs:element name="name" type="xs:string"/>              
                <xs:element name="age" type="xs:positiveInteger"/>      
                <xs:element name="email">                               
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:pattern                                 
    value="[a-z0-9A-Z]+([-|\.]?[a-z0-9A-Z])*@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+ [a-zA-Z]{2,}"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="sn" type="xs:string" use="required"/>   
        </xs:complexType>
    </xs:schema>

    ① 使用XSDL中的xs:element元素来声明employee元素,它的类型为empType,这是自定义的类型,在②处定义。

    ② 使用XSDL中的xs:complexType元素来定义复杂类型,属性name指定自定义类型的名字,该名字可以被xs:element元素的type属性所引用。

    ③ XSDL中的xs:sequence元素用于指定在它内部声明的元素必须按照声明的顺序出现。①、②、③合起来与例4-4中的①(<!ELEMENT employee (name,age,email)>)对应。

    ④ 声明name元素,其内容只能是字符串值。与例4-4中的②(<!ELEMENT name (#PCDATA)>)对应。

    ⑤ 声明age元素,其内容只能是正整数。与例4-4中的③(<!ELEMENT age (#PCDATA)>)对应。

    ⑥ 声明email元素,使用正则表达式对email元素的内容做了限定,要求内容必须符合邮件格式的规范。与例4-4中的④(<!ELEMENT email (#PCDATA)>)对应。

    ⑦ XSDL中的xs:pattern元素使用正则表达式来限制值的范围。

    ⑧ 声明sn属性,属性值是字符串,该属性是必需的(use="required")。与例4-4中的⑤(<!ATTLIST employee sn CDATA #REQUIRED>)对应。

    从例4-5的XML Schema的定义可以看出,XML Schema具有丰富的数据类型,除了内置的数据类型外(例如:xs:string、xs:positiveInteger),我们还可以定义自己的数据类型(例如:empType)。

    如果以建筑图纸与建筑的关系为例来比较XML Schema和DTD,那么DTD只能定义厨房、阳台的位置,主卧的结构等,而XML Schema还可以定义卧室使用什么类型的地板、阳台选用什么类型的铝合窗,即XML Schema定义了丰富的数据类型。

    DTD不能很好地满足XML自动化处理的要求(由于采用了非XML语法格式),缺乏对文档结构、元素、属性、数据类型等约束的足够描述。与XML Schema相比,DTD具有以下的局限性:

    (1)对数据类型提供了非常有限的支持,且只适用于属性;

    (2)约束定义能力不足,无法对XML实例文档做出更细致的语义限制;

    (3)DTD定义不够结构化,重用的代价相对较高;

    (4)不使用XML语法,无法采用一致的方式来处理XML文档和DTD。

    (5)对名称空间仅提供了有限的支持。

    例4-5中,xs:pattern元素的value属性的值为:

    [a-z0-9A-Z]+([-|\.]?[a-z0-9A-Z])*@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}

    这个正则表达式各个组成部分的含义如下:

    * [a-z0-9A-Z]+

    a~z范围内的任意一个字母,或者0~9范围内的任意一个数字,或者A~Z范围内的任意一个字母。使用加号(+)表示字母或数字可以出现1到多次。例如:a、7、d10、abc99、a99b

    * ([-|\.]?[a-z0-9A-Z])*

    其中 [-|\.]* 表示允许出现0或者1个 “-”或者“.”。[a-z0-9A-Z]匹配多位数字或字母。使用星号(*)表示以上组合可以重复出现0到多次。例如:-a、-a99、.a0b。

    * @

    匹配@号。

    * ([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+

    其中[a-z0-9A-Z]+同第一项。-[a-z0-9A-Z]+ 表示“-”可以和任意的字母或数字组合。(-[a-z0-9A-Z]+)* 表示该组合可以出现0次或1次,\. 匹配“.” 。上述完整表达式匹配任意字母或数字组成的字符序列,中间可以出现“-”,最后必须是“.”。例如:0c-0.、sina.com.、sg-mail.。

    * [a-zA-Z]{2,}

    匹配至少两个字母,大小写都可以。现在有mobi和name域名,要限制最后的字母个数,可以写为:[a-zA-Z]{2,4}

    例如:cn、com、org等。

    4.4   术语明晰
    XML Schema中有一些术语不是很好理解,为了便于后续内容的学习,这一节我们首先明确一些术语的含义。

    * 模式

    模式指的是依照XML Schema规范,使用http://www.w3.org/2001/XMLSchema名称空间中的元素来描述XML文档结构的规则集。模式由许多不同类型的组件构成,包括:元素、属性、简单类型、复杂类型、记号(notation)、元素组(模型组定义)、属性组和标识约束等。

    模式在模式文档中定义,模式文档通常以文件的形式存在,扩展名为.xsd。不过,模式文档不是必须要以文件的形式存在,它们在应用程序中可以以字节流的形式存在,也可以作为数据库记录而存在。

    每个模式定义都以一个根元素xs:schema开始,该元素属于http://www.w3.org/ 2001/XMLSchema名称空间。

    * 实例和模式

    模式用于定义XML文档的结构,并对文档的内容进行约束,符合某个模式的XML文档称为实例。检查一个实例文档是否符合一个或多个模式的过程,称为模式验证(schema validation)。包含模式定义的文档称为模式文档,符合某个特定模式的XML文档称为实例文档。

    * 声明和定义

    在XML Schema推荐标准中,使用了“声明”和“定义”两个术语。对于出现在实例文档中并通过名称来验证的组件使用“声明”,这些组件包括元素、属性、记号(notation),如元素声明、属性声明。对于在模式内部中的组件使用“定义”,这些组件包括数据类型、元素组、属性组和一致性约束,如数据类型定义,元素组定义。

    [此贴子已经被作者于2009-1-14 21:35:54编辑过]

       收藏   分享  
    顶(0)
      




    ----------------------------------------------

    -----------------------------------------------

    第十二章第一节《用ROR创建面向资源的服务》
    第十二章第二节《用Restlet创建面向资源的服务》
    第三章《REST式服务有什么不同》
    InfoQ SOA首席编辑胡键评《RESTful Web Services中文版》
    [InfoQ文章]解答有关REST的十点疑惑

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/1/14 19:57:00
     
     admin 帅哥哟,离线,有人找我吗?
      
      
      
      威望:9
      头衔:W3China站长
      等级:计算机硕士学位(管理员)
      文章:5255
      积分:18406
      门派:W3CHINA.ORG
      注册:2003/10/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给admin发送一个短消息 把admin加入好友 查看admin的个人资料 搜索admin在『 DTD/XML Schema 』的所有贴子 点击这里发送电邮给admin  访问admin的主页 引用回复这个贴子 回复这个贴子 查看admin的博客2
    发贴心情 


    图4-1  内置数据类型的层次结构

    面与类型的关系就好像棱镜的面与棱镜的关系,透过不同的面,你看到的景观(内容)是不同的。在XML Schema中,面相当于是对一个现有的简单类型添加某些约束(限制),约束不同,得到的结果就不同。也就是说,你可以把面(facet)看成是对数据类型的约束,目的是为了让它的值限制在一定的范围内。实际上,这些面就是http://www.w3.org/ 2001/XMLSchema名称空间中的一些元素,只不过这些元素是用来对现有类型的值进行约束的,因而称为面。

    要定义新的简单类型,使用xs:simpleType元素,要对现有的基类型进行限制,使用xs:restriction元素,并在该元素的内部使用限制值范围的面(facet)。例如,我们定义一个雇员年龄的类型,雇员年龄要求在18~60岁之间,我们可以从内置的xs:integer类型派生一个新的简单类型ageType,然后使用xs:minInclusive和xs:maxInclusive面来限制年龄值的范围,如例4-9所示。

    例4-9  使用minInclusive和maxInclusive面来限制年龄值的范围

    <xs:simpleType name="ageType">
        <xs:restriction base="xs:integer" >      
             <xs:minInclusive value="18"/>
             <xs:maxInclusive value="60"/>
        </xs:restriction>
    </xs:simpleType>

    ① xs:restriction元素的base属性指定要限制的基类型。

    关于简单类型更详细的内容请参见第5章和第6章。

    4.5.4  复杂类型
    具有复杂类型的元素可以有子元素和属性。复杂类型使用xs:complexType元素来定义。

    复杂类型要么具有简单内容,要么具有复杂内容。元素的“内容”是指在它的开始标签和结束标签之间的字符数据和子元素。简单内容指的是它只包含字符数据内容,而没有子元素(可以有属性),简单内容使用xs:simpleContent元素来定义;除此之外的元素内容称为复杂内容,复杂内容使用xs:complexContent元素来定义。

    例如,对于例4-10所示的具有简单内容的book元素,它的复杂类型定义如例4-11所示。

    例4-10  实例文档中的book元素

    <book isbn= "978-7-121-06812-6">Struts 2深入详解</book>

    例4-11  模式文档中的bookType类型定义

    <xs:element name="book" type="bookType"/>
    <xs:complexType name="bookType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="isbn" type="xs:token"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    简单内容类型的复杂元素要求必须含有文本,可以有属性。

    对于例4-12所示的具有复杂内容的student元素,它的复杂类型定义如例4-13所示。

    例4-12  实例文档中的student元素

    <student>
        <name>张三</name>
        <age>20</age>
    </student>

    例4-13  模式文档中的studentType类型定义

    <xs:element name="book" type="studentType"/>
    <xs:complexType name="studentType">
        <xs:complexContent>
            <xs:restriction base="xs:anyType">
                <xs:sequence>
                    <xs:element name="name" type="xs:string"/>
                    <xs:element name="age" type="xs:integer"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>

    复杂内容类型的复杂元素可以有属性,但不能有文本。

    关于复杂类型更详细的内容请参见第7章。

    4.5.5  全局声明和局部声明
    直接在xs:schema元素下声明的元素和属性是全局的,这些元素和属性可以通过xs:element和xs :attribute元素的ref属性来引用。我们看例4-14。

    例4-14  book.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="book" type="bookType"/>
        <xs:element name="title" type="xs:token"/>
        <xs:element name="author" type="xs:token"/>
        <xs:attribute name="isbn" type="xs:token"/>
        <xs:complexType name="bookType">
            <xs:sequence>
                <xs:element ref="title"/>
                <xs:element ref="author"/>
            </xs:sequence>
            <xs:attribute ref="isbn"/>
        </xs:complexType>
    </xs:schema>

    在例4-14中,声明的元素book、title和author,以及属性isbn都是全局的,在bookType类型定义中,我们通过xs:element和xs :attribute元素的ref属性来引用全局声明的元素和属性。

    要注意的是:(1)全局声明的元素和属性的名称在模式中必须是唯一的。(2)在全局声明中不能使用ref属性。(3)全局声明的元素在实例文档中可以作为根元素出现。

    在复杂类型定义内部声明的元素和属性是局部的,由于简单类型不能有子元素和属性,所以局部元素声明和局部属性声明不能出现在简单类型定义内部。我们将例4-14中的title、author元素,以及isbn属性改为局部声明,如例4-15所示。

    例4-15  book2.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="book" type="bookType"/>
        <xs:complexType name="bookType">
            <xs:sequence>
                <xs:element name="title" type="xs:token"/>
                <xs:element name="author" type="xs:token"/>
            </xs:sequence>
            <xs:attribute name="isbn" type="xs:token"/>
        </xs:complexType>
    </xs:schema>

    现在title、author元素和isbn属性都是在bookType类型定义内部声明的,这些局部声明只能在bookType类型定义内部使用。

    如果模式文档中所有声明的元素名都是唯一的,那么可以使用全局声明,然而,当有两个同名但具有不同类型的元素时,你就只能使用局部声明了。例如,你可以声明一个局部元素title,它有xs:token类型,而且它是book元素的子元素,在同一个模式文档中,你还可以声明一个局部元素title,它可带有枚举值“Mr Mrs Ms”。

    对于属性而言,属性通常是附属于元素的,因此将属性声明为全局的意义不大,除非多个元素要使用相同的属性。

    4.5.6  模式与名称空间
    DTD的问题就在于和名称空间不相关,当你为一个XML文档使用了名称空间后,文档的DTD就需要重写。XML Schema对名称空间提供了很好的支持。在编写模式文档时,你可以指定该模式文档是为哪一个名称空间声明和定义组件,这个名称空间称为目标名称空间

    4.5.6.1  目标名称空间
    目标名称空间使用xs:schema元素的targetNamespace属性来指定,如例4-16所示。

    例4-16  book3.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.sunxin.org/book"        
        xmlns:book="http://www.sunxin.org/book" >           
        <xs:element name="book" type="book:bookType"/>      
        <xs:complexType name="bookType" >                    
            <xs:sequence>
                <xs:element name="title" type="xs:string"/>
                <xs:element name="author" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="isbn" type="xs:token"/>
        </xs:complexType>
    </xs:schema>

    ① 我们在xs:schema元素上使用targetNamespace属性指定目标名称空间为:http://www.sunxin.org/book,即指明了在该模式文档中声明的元素、定义的类型都属于http://www.sunxin.org/book名称空间。

    ② 声明名称空间http://www.sunxin.org/book,并为该名称空间绑定前缀book,使用该前缀来引用http://www.sunxin.org/book名称空间中的类型。

    ③ 由于指定了目标名称空间,文档中定义的类型都属于目标名称空间,因此在引用类型时,需要加上book前缀。

    ④ 在指定类型名时,不需要加上任何前缀,当使用了targetNamespace属性后,在模式文档中定义的任何类型都属于目标名称空间。

    在模式文档中,我们很容易就能区分出不同名称空间中的元素和类型,带有xs前缀的元素和类型属于http://www.w3.org/2001/XMLSchema名称空间,而其他的元素和类型则属于目标名称空间。需要注意的是,只有模式文档中的全局元素和全局属性才属于目标名称空间,在本例中,声明的全局元素name属于目标名称空间,而局部元素title和author则不属于目标名称空间。

    为了简化模式文档对目标名称空间中的元素和类型的引用,我们可以利用默认名称空间来简化引用,例4-16如果使用了默认名称空间,可以修改为如例4-17所示。

    例4-17  使用了默认名称空间的book4.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.sunxin.org/book"
        xmlns="http://www.sunxin.org/book" >
        <xs:element name="book" type="bookType" />
        <xs:complexType name="bookType">
            <xs:sequence>
                <xs:element name="title" type="xs:string"/>
                <xs:element name="author" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="isbn" type="xs:token"/>
        </xs:complexType>
    </xs:schema>

    我们在xs:schema元素上声明了默认名称空间http://www.sunxin.org/book,因此在声明book元素时,引用bookType类型就无须再添加前缀了。

    符合上述模式文档的XML实例文档如例4-18所示。

    例4-18  book.xml

    <?xml version="1.0" encoding="GB2312"?>
    <book:book xmlns:book="http://www.sunxin.org/book" isbn="978-7-121-06812-6">  
        <title>《Struts 2深入详解》</title>
        <author>孙鑫</author>
    </book:book>

    在例4-17的模式文档中,在bookType类型定义中声明的元素title和author是局部元素,没有被目标名称空间所限定,因此在实例文档中,对title和author元素不要添加book前缀。

    ----------------------------------------------

    -----------------------------------------------

    第十二章第一节《用ROR创建面向资源的服务》
    第十二章第二节《用Restlet创建面向资源的服务》
    第三章《REST式服务有什么不同》
    InfoQ SOA首席编辑胡键评《RESTful Web Services中文版》
    [InfoQ文章]解答有关REST的十点疑惑

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/1/14 21:14:00
     
     admin 帅哥哟,离线,有人找我吗?
      
      
      
      威望:9
      头衔:W3China站长
      等级:计算机硕士学位(管理员)
      文章:5255
      积分:18406
      门派:W3CHINA.ORG
      注册:2003/10/5

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给admin发送一个短消息 把admin加入好友 查看admin的个人资料 搜索admin在『 DTD/XML Schema 』的所有贴子 点击这里发送电邮给admin  访问admin的主页 引用回复这个贴子 回复这个贴子 查看admin的博客3
    发贴心情 
    4.5.6.2  局部元素和属性的限定
    在例4-17中,局部元素title和author没有被目标名称空间所限定,如果要限定局部元素和属性,可以通过xs:schema元素的elementFormDefault和attibuteFormDefault属性来设置。

    为了指定模式文档中局部声明的元素必须被限定,可以将xs:schema元素的elementFormDefault属性的值设为"qualified"。

    将例4-17中的xs:schema元素修改为如例4-19所示。

    例4-19  book5.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.sunxin.org/book"
        xmlns="http://www.sunxin.org/book"
        elementFormDefault="qualified" >
        <xs:element name="book" type="bookType"/>
        <xs:complexType name="bookType">
            <xs:sequence>
                <xs:element name="title" type="xs:string"/>
                <xs:element name="author" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="isbn" type="xs:token"/>
        </xs:complexType>
    </xs:schema>

    elementFormDefault属性的默认值是unqualified,即对局部声明的元素不加限定。

    我们修改了模式文档,相应的就要修改实例文档,如例4-20所示。

    例4-20  book2.xml

    <?xml version="1.0" encoding="GB2312"?>
    <book:book xmlns:book="http://www.sunxin.org/book" isbn="978-7-121-06812-6">
        <book:title>《Struts 2深入详解》</book:title>
        <book:author>孙鑫</book:author>
    </book:book>

    在例4-20的实例文档中,所有的元素都属于同一个名称空间,因此我们可以声明一个默认的名称空间,来省略前缀的使用,如例4-21所示。

    例4-21  book3.xml

    <?xml version="1.0" encoding="GB2312"?>
    <book xmlns="http://www.sunxin.org/book" isbn="978-7-121-06812-6">
        <title>《Struts 2深入详解》</title>
        <author>孙鑫</author>
    </book>

    属性的限定和元素的限定是类似的。如果属性被声明为全局属性或者xs:schema元素的attibuteFormDefault属性被设置成"qualified"的话,那么属性就必须被限定,在实例文档中将以带名称空间前缀的方式出现。实际上,需要限定的属性必须明确的加上名称空间前缀,因为XML名称空间推荐标准中并没有给出关于属性的默认名称空间的机制,一个没有前缀的属性将不在任何的名称空间中。属性是附属于元素的,对属性添加名称空间不是很有必要,因此在多数应用中都没有给属性添加限定。

    使用了attibuteFormDefault属性的模式文档,如例4-22所示。

    例4-22  book6.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns="http://www.sunxin.org/book"
        targetNamespace="http://www.sunxin.org/book"
        elementFormDefault="qualified"
        attributeFormDefault="qualified" >
        <xs:element name="book" type="bookType"/>
        <xs:complexType name="bookType">
            <xs:sequence>
                <xs:element name="title" type="xs:string"/>
                <xs:element name="author" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="isbn" type="xs:token"/>
        </xs:complexType>
    </xs:schema>

    attributeFormDefault属性的默认值是unqualified,即对局部声明的属性不加限定。

    一个符合模式(例4-22)的实例文档如例4-23所示。

    例4-23  book4.xml

    <?xml version="1.0" encoding="GB2312"?>
    <book:book xmlns:book="http://www.sunxin.org/book" book:isbn="978-7-121-06812-6" >
        <book:title>《Struts 2深入详解》</book:title>
        <book:author>孙鑫</book:author>
    </book:book>

    除了使用xs:schema元素的elementFormDefault和attibuteFormDefault属性来限定局部元素和局部属性外,我们还可以在xs:element和xs:attribute元素上分别使用form属性来限定局部元素和局部属性。我们看例4-24。

    例4-24  book7.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.sunxin.org/book"
    targetNamespace="http://www.sunxin.org/book">
        <xs:element name="book" type="bookType"/>
        <xs:complexType name="bookType">
            <xs:sequence>
                <xs:element name="title" type="xs:string" form="qualified" />
                <xs:element name="author" type="xs:string" form="qualified" />
            </xs:sequence>
            <xs:attribute name="isbn" type="xs:token" form="qualified" />
        </xs:complexType>
    </xs:schema>

    例4-24所示的模式文档和例4-22所示的模式文档的效果是一样的。  

    要注意的是,在xs:schema元素上使用elementFormDefault和attibuteFormDefault属性,影响的是整个模式文档中的局部元素和局部属性,而在xs:element和xs:attribute元素上使用form属性,影响的是当前的局部元素和局部属性。

    4.5.6.3  未声明的目标名称空间
    对于很多不使用名称空间的XML文档,你需要使用没有声明目标名称空间的模式文档。我们看例4-25。

    例4-25  book8.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="book" type="bookType" />
        <xs:complexType name="bookType">
            <xs:sequence>
                <xs:element name="title" type="xs:string"/>
                <xs:element name="author" type="xs:string"/>
            </xs:sequence>
            <xs:attribute name="isbn" type="xs:token"/>
        </xs:complexType>
    </xs:schema>

    在这个模式文档中我们没有声明目标名称空间,因此定义的bookType类型和声明的book元素都是没有名称空间限定的。在引用类型或元素时,不需要添加任何的名称空间前缀。在本例中,声明book元素时,type属性直接引用了bookType类型。与之相对的是,例4-25的模式文档中使用的所有XML Schema元素和类型都是通过与XML Schema名称空间相关联的名称空间前缀“xs”来明确进行限定的。

    一个符合模式(例4-25)的实例文档如例4-26所示。

    例4-26  book5.xml

    <?xml version="1.0" encoding="GB2312"?>
    <book isbn="978-7-121-06812-6">
        <title>《Struts 2深入详解》</title>
        <author>孙鑫</author>
    </book>

    要注意的是,在没有声明目标名称空间的模式文档中,强烈建议对所有的XML Schema元素和类型使用一个和XML Schema名称空间相关联的名称空间前缀(如xs或xsd)来明确实施限定。如果你对XML Schema的元素和类型使用了默认名称空间,那么对XML Schema类型的引用也许不能和对用户自定义类型的引用相区分,从而导致模式文档出现错误。例4-27错误的使用了默认名称空间,使得对自定义类型的引用和对XML Schema类型的引用不能区分。

    例4-27  book9.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" >
        <element name="book" type="bookType" />
        <complexType name="bookType">
            <sequence>
                <element name="title" type="string"/>
                <element name="author" type="string"/>
            </sequence>
            <attribute name="isbn" type="token"/>
        </complexType>
    </schema>

    在XMLSpy中验证这个模式文档时,将提示如下的错误信息:

    'bookType' must refer to an existing simple or complex type.

    这是因为模式验证器认为对bookType类型的引用(没有前缀的引用),引用的是默认名称空间(即http://www.w3.org/2001/XMLSchema名称空间)中的类型,而XML Schema名称空间中并没有bookType这种类型,因此就报出了错误。

    4.5.7  在实例中引用模式文档
    XML Schema提供了两个在实例文档中使用的特殊属性,用于指出模式文档的位置。这两个属性是:xsi:schemaLocation和xsi:noNamespaceSchemaLocation,前者用于声明了目标名称空间的模式文档,后者用于没有目标名称空间的模式文档,它们通常在实例文档中使用。

    4.5.7.1  xsi:schemaLocation属性
    xsi:schemaLocation属性的值由一个URI引用对组成,两个URI之间以空白符分隔。第一个URI是名称空间的名字,第二个URI给出模式文档的位置,模式处理器将从这个位置读取模式文档,该模式文档的目标名称空间必须与第一个URI相匹配。我们看例4-28。

    例4-28  book6.xml

    <?xml version="1.0" encoding="GB2312"?>
    <book xmlns="http://www.sunxin.org/book"         
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
        xsi:schemaLocation="http://www.sunxin.org/book http://www.sunxin.org/ book.xsd" >        
        <title>《Struts 2深入详解》</title>
        <author>孙鑫</author>
    </book>

    ① 声明默认的名称空间(http://www.sunxin.org/book)。

    ② 声明XML Schema实例名称空间(http://www.w3.org/2001/XMLSchema-instance),并将xsi前缀与该名称空间绑定,这样模式处理器就可以识别xsi:schemaLocation属性。XML Schema实例名称空间的前缀通常使用xsi。

    ③ 使用xsi:schemaLocation属性指定名称空间http://www.sunxin.org/book和模式位置http://www.sunxin.org/book.xsd相关。要注意,在这个例子中,book.xsd中声明的目标名称空间要求是http://www.sunxin.org/book

    一个可能的模式文档book.xsd如例4-29所示。

    例4-29  book.xsd

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns="http://www.sunxin.org/book"
        targetNamespace="http://www.sunxin.org/book"
        elementFormDefault="qualified" >
        <xs:element name="book" type="bookType"/>
        <xs:complexType name="bookType">
            <xs:sequence>
                <xs:element name="title" type="xs:string"/>
                <xs:element name="author" type="xs:string"/>
            </xs:sequence>      
        </xs:complexType>
    </xs:schema>

    实际上,xsi:schemaLocation属性的值也可以由多个URI引用对组成,每个URI引用对之间使用空白符分隔。例4-30的实例文档使用了多个名称空间,xsi:schemaLocation属性的值包含了两对URI。

    例4-30  books.xml

    <?xml version="1.0" encoding="GB2312"?>
    <books xmlns="http://www.sunxin.org/bks" xmlns:p="http://www.sunxin.org/people"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.sunxin.org/bks bks.xsd
                             http://www.sunxin.org/people people.xsd" >
        <book>
            <title>JSP深入编程</title>
            <author>
                <p:name>张三</p:name>
                <p:title>作家</p:title>
            </author>
        </book>
        <book>
            <title>XML从入门到精通</title>
            <author>
                <p:name>李四</p:name>
                <p:title>教师</p:title>
            </author>
        </book>
    </books>

    XML Schema推荐标准中指出,xsi:schemaLocation属性可以在实例中的任何元素上使用,而不一定是根元素,不过,xsi:schemaLocation属性必须出现在它要验证的任何元素和属性之前。

    此外,要注意的是,XML Schema推荐标准并没有要求模式处理器必须要使用xsi:schemaLocation属性,某些模式处理器可以通过其他的方式来得到模式文档的位置,而忽略xsi:schemaLocation属性。

    4.5.7.2  xsi:noNamespaceSchemaLocation属性
    xsi:noNamespaceSchemaLocation属性用于引用没有目标名称空间的模式文档。与xsi:schemaLocation属性不同的是,xsi:noNamespaceSchemaLocation属性的值是单一的值,只是用于指定模式文档的位置。例4-31显示了在实例文档中xsi:noNamespaceSchema Location属性的使用。

    例4-31  book7.xml

    <?xml version="1.0" encoding="GB2312"?>
    <book xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="book.xsd"
        isbn="978-7-121-06812-6" >
        <title>《Struts 2深入详解》</title>
        <author>孙鑫</author>
    </book>

    与xsi:schemaLocation属性一样,xsi:noNamespaceSchemaLocation属性也可以在实例中的任何元素上使用,而不一定是根元素,不过,xsi:noNamespaceSchemaLocation属性必须出现在它要验证的任何元素和属性之前。

    此外,要注意的是,XML Schema推荐标准并没有要求模式处理器必须要使用xsi:noNamespaceSchemaLocation属性,某些模式处理器可以通过其他的方式来得到模式文档的位置,而忽略xsi:noNamespaceSchemaLocation属性。

    4.5.8  注解
    在XML文档中提供附加信息的通常方式是使用注释,即在“<!--”和“-->”之间给出注释信息。在XML Schema中,注释仍然可以使用,不过为了方便其他读者和应用程序来理解模式文档,XML Schema提供了三个元素来为模式提供注解。这三个元素是:xs:annotation、xs:documentation和xs:appinfo,其中xs:documentation和xs:appinfo是作为xs:annotation元素的子元素使用的。xs:documentation元素用于放置适合人阅读的信息,而xs:appinfo元素则用于为工具、样式表和其他应用程序提供信息。

    我们看例4-32。

    例4-32  hr.xsd

    <?xml version="1.0" encoding="GB2312"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:annotation>
            <xs:documentation xml:lang="zh">
                这是一份用于企业雇员信息描述的模式文档
            </xs:documentation>
        </xs:annotation>
        <xs:element name="hr">
            <xs:annotation>
                <xs:documentation xml:lang="zh">
                    hr元素是文档的根元素,使用匿名类型定义来声明
                </xs:documentation>
            </xs:annotation>
            <xs:complexType>
                <xs:annotation>
                    <xs:documentation xml:lang="zh">
                        根元素hr下可以有多个employee子元素[B][/B]
                    </xs:documentation>
                </xs:annotation>
                <xs:sequence>
                    <xs:element name="employee" maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>

    xs:annotation元素常常在元素声明或类型定义的开头使用,用于对元素的作用、类型的定义提供附加的描述信息。为了说明这些描述信息所使用的语言,可以在xs:documentation元素上使用xml:lang属性来指定语言,xml:lang属性的值是在IETF RFC 3066(Tags for the Identification of Languages)或它的后继版本中定义的语言标识符。

    xs:appinfo元素用于为计算机自动处理提供信息,它没有且也不需要xml:lang属性。xs:annotation元素和xs:appinfo元素还有一个可选的source属性,它的值是一个URI引用,指向一个包含了描述信息的文档位置。

    4.6   在XMLSpy中创建模式文档
    要在XMLSpy中创建一个模式文档,可以单击菜单【File】→【New…】,在弹出的“Create new document”对话框中选择“xsd W3C XML Schema”,单击“OK”按钮,如图4-2所示。


    图4-2  在XMLSpy中创建模式文档

    XMLSpy创建的模式文档如图4-3所示。


    图4-3  XMLSpy创建的模式文档

    单击主窗口下方的“Text”标签,可以进入文本编辑窗口。

    要为现有的XML文档关联一个模式文档,除了手写xsi:schemaLocation属性或xsi:noNamespaceSchemaLocation属性外,在XMLSpy中还可以通过菜单操作来为一个XML文档关联模式文档。在XML文档编辑窗口中,单击菜单【DTD/Schema】→【Assign Schema...】,出现“选择文件”对话框,如图4-4所示。


    图4-4 “选择文件”对话框

    单击“Browse…”按钮,选择要关联的模式文档。选定模式文档后,单击“OK”按钮,XMLSpy会自动为你在XML文档中添加xsi:schemaLocation属性或xsi:noNamespace SchemaLocation属性信息。

    在关联模式文档后,要使用关联的模式文档对XML文档进行验证,可以在XML文档编辑窗口中单击菜单【XML】→【Validate XML】,或者按下功能键F8进行验证(参见2.4节)。

    4.7   模式文档的验证
    模式文档主要用于验证XML文档(实例文档)的有效性,不过,在XML Schema推荐标准中,也定义了对模式文档本身进行验证的验证规则。要对模式文档进行验证,可以用XMLSpy打开模式文档,然后单击菜单【XML】→【Validate XML】,或者按下功能键F8对模式文档进行验证。

    4.8   小结
    本章的目的是为了帮助读者快速建立起对模式文档结构的一个整体印象,在本章中介绍过的某些内容,后面还会有专门的章节进行深入而详细的讲解。

    本章首先介绍了XML Schema推荐标准,接着通过模式文档和DTD文档的比较,让读者对模式文档的作用和强大有了一个初步的认识。接下来,我们介绍了XML Schema中的一些术语,以方便读者对后续内容的学习。之后,我们对XML Schema的结构做了一个概要的介绍,包括元素和属性的声明、简单类型和复杂类型的定义、全局声明和局部声明、模式和名称空间、在实例中引用模式文档等。

    --------------------------------------------------------------------------------

    [①] 这个图引用自XML Schema Part 2: Datatypes Second Edition。

    ----------------------------------------------

    -----------------------------------------------

    第十二章第一节《用ROR创建面向资源的服务》
    第十二章第二节《用Restlet创建面向资源的服务》
    第三章《REST式服务有什么不同》
    InfoQ SOA首席编辑胡键评《RESTful Web Services中文版》
    [InfoQ文章]解答有关REST的十点疑惑

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/1/14 21:23:00
     
     gywinner 美女呀,离线,快来找我吧!
      
      
      等级:大一新生
      文章:0
      积分:57
      门派:XML.ORG.CN
      注册:2006/9/7

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给gywinner发送一个短消息 把gywinner加入好友 查看gywinner的个人资料 搜索gywinner在『 DTD/XML Schema 』的所有贴子 引用回复这个贴子 回复这个贴子 查看gywinner的博客4
    发贴心情 
    能否提供全面的啊
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2009/2/21 16:25:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 DTD/XML Schema 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/28 11:12:50

    本主题贴数4,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    187.500ms