当前位置: 首页 > 图文教程 > Java技术 > Java Web开发 > 孙鑫老师原创:XML Schema初窥(一)

Java Web开发
孙鑫老师原创:XML Schema初窥(二)
Java开源技术:J2EE应用服务器
用java开发Email工具之发送邮件
Java数据库程序中的存储过程设计
JAVA IO 设计模式彻底分析
Java Web开发:Java模式设计之单例模式(一)
Java Web开发:Java模式设计之单例模式(二)
Java Web开发:基于JVM的语言正在开始流行
Java Web开发:Java语言的十大问题,你能解决吗?
Java Web开发:Struts2 中.action和.do的奥秘
Java web:孙鑫老师谈Servlet的线程模型
java Web开发:孙鑫老师谈Session和Cookie的深入研究
Java Web开发:在线人数统计程序
Java Web开发:小编概述JSP技术
Java Web开发:FreeMarker模板使用方法讲解
Java Web开发:Tomcat和IIS的配合
Java Web开发:小编谈JFreeChart统计柱形图表事例
Java Web开发:程序员之家七月份Java Web开发总结
Java Web开发:Tomcat和Apache的配合
Java Web开发:iBATIS延迟加载的那点事

Java Web开发 中的 孙鑫老师原创:XML Schema初窥(一)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 135 ::
收藏到网摘: n/a

4.1   XML Schema推荐标准

W3C1998年开始制定XML Schema标准,200152正式发布了XML Schema 1.0的第一版。20041028W3C发布了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 languageXSDL),描述了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定义的一种应用。

 

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

 

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

4-1  simple.xsd

 

模式文档本身也是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- simple.xml

 

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

 

4.3   XML SchemaDTD的比较

我们看例4-3所示的XML文档。

4-3  employee.xml

  

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


 

<employee sn="hr-01-001">


 

    <name>张三</name>


 

    <age>26</age>


 

    <email>[email protected]</email>

 

</employee>
 

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

4-4  employee.dtd

 

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

如果我们想要在上述DTD定义的基础上进一步限制元素的内容,例如,限制age元素的内容只能是正整数,或者限制email元素的内容必须是有效的邮件格式,DTD就无能为力了。下面我们采用XML Schema来定义例4-3XML文档的结构并约束文档的内容,如例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元素使用正则表达式来限制值的范围。关于XML Schema中正则表达式的更多内容请参见附录B


 

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


 

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


 

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


 

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


 

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


 

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


 

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


 

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


 

az范围内的任意一个字母,或者09范围内的任意一个数字,或者AZ范围内的任意一个字母。使用加号(+)表示字母或数字可以出现1到多次。例如:a7d10abc99a99b


 

?  ([-|\.]?[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,}


 

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


 

例如:cncomorg等。

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),如元素声明、属性声明。对于在模式内部中的组件使用“定义”,这些组件包括数据类型、元素组、属性组和一致性约束,如数据类型定义,元素组定义。

4.5 XML Schema概述
 

这一节我们来快速了解一下XML Schema的结构。

 

4.5.1  元素和属性的声明


 

元素和属性分别通过http://www.w3.org/2001/XMLSchema名称空间中的elementattribute元素来声明,如例4-6所示。


 

4-6  在模式文档中声明元素和属性


4.5.2  元素和属性的类型


 

我们看例4-7XML文档。


 

4-7  desk.xml


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

 

<desk length="1.2" width="0.6" color="white">
 

    <name>办公桌</name>
 

    <drawer>


        <amount>2</amount>


    </drawer>


 

</desk>
 

从本质上来说,XML文档只能保存文本格式的数据,例如,length属性的值1.2amount元素的内容2,都是字符形式,然而,为了让XML文档能够进行数据交换(如与数据库或程序内存中的数据进行交换),需要人为地为XML文档中的数据定义一些数据类型,以方便对元素内容和属性值进行验证。DTD对数据类型的支持是非常有限的,而XML Schema则提供了丰富的数据类型,并且允许自定义数据类型。


 

XML Schema中,元素和属性都有数据类型,元素的数据类型即元素内容的数据类型,属性的数据类型即属性值的数据类型。XML Schema把元素和属性的概念与其数据类型分开,这就允许不同名称的元素拥有相同类型的数据。例如,我们可以声明两个元素homeAddressofficeAddress,它们具有相同的结构,但名称不同,我们只需要定义一种数据类型addressType,然后在两个元素的声明中引用它,如例4-8所示。


 

4-8  元素homeAddressofficeAddress具有相同的类型

 

<xs:element name="homeAddress" type="addressType"/>


 

<xs:element name="officeAddress" type="addressType"/>

  


<xs:complexType name="addressType">


 

    <xs:sequence>


 

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


 

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


 

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


 

    </xs:sequence>

 

</xs:complexType>
 

元素如果包含子元素或者带有属性则称为具有复杂类型,如例4-7中的deskdrawer元素;反之元素如果仅仅包含字符数据(可以是数字、字符串、日期或者其他数据类型),不包含任何子元素,也不带有属性则称为具有简单类型,如例4-7中的nameamount元素。属性总是具有简单类型,因为属性不能有子元素或其他属性。


 4.5.3  简单类型


 

具有简单类型的元素只能包含字符数据,不能包含子元素,也不能有属性。XML Schema推荐标准内置了44种简单类型,如例4-6、例4-8中的xs:stringxs:integer等,这些简单类型可以直接引用。XML Schema内置的数据类型的层次结构如图[1]4-1所示。


 

XML Schema支持类型的派生,这和面向对象语言中对象的继承有些类似,但又不完全相同。XML Schema类型的派生分为限制(restriction)和扩展(extension),通过限制派生的新类型的值范围是原类型值范围的子集,通过扩展则可以为现有类型添加新的元素和属性。


 

对于简单类型,只有限制派生而没有扩展派生,我们只能通过限制一个现有的简单类型(内置的简单类型或派生于内置简单类型的简单类型)来派生一个新的简单类型。那如何对现有的简单类型进行限制呢?XML Schema给我们提供了12个面(facet),用于指定一个值的有效范围、约束值的长度和精度、枚举一系列的有效值,或者指定有效值必须匹配的正则表达式。


 


 


 

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


 

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


 

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


 

4-9  使用minInclusivemaxInclusive面来限制年龄值的范围


 

<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 issn= "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类型定义


 

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


 

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

 

 

 

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


 

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


 

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


 

    <xs:attribute name="sn" type="xs:integer"/>


 

</xs:schema>

 

 


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

 

<root>欢迎访问软晨学习网(www.ruanchen.com)</root>

 

<!ELEMENT employee (name,age,email)>        ①

 

<!ELEMENT name (#PCDATA)>                   ②

 

<!ELEMENT age (#PCDATA)>                    ③

 

<!ELEMENT email (#PCDATA)>                  ④

 

<!ATTLIST employee sn CDATA #REQUIRED>      ⑤

<xml version="1.0"?>       ①
 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">②

<xs:element name="root" type="xs:string"/>             ③

</xs:schema>