`
hougbin
  • 浏览: 502429 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

XMLSchema 详解

    博客分类:
  • XML
阅读更多

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



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)对名称空间仅提供了有限的支持。

 术语明晰

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

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

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

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

元素和属性的类型

我们看例4-7的XML文档。

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

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

例4-8  元素homeAddress和officeAddress具有相同的类型

<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中的desk和drawer元素;反之元素如果仅仅包含字符数据(可以是数字、字符串、日期或者其他数据类型),不包含任何子元素,也不带有属性则称为具有简单类型,如例4-7中的name和amount元素。属性总是具有简单类型,因为属性不能有子元素或其他属性。

简单类型

具有简单类型的元素只能包含字符数据,不能包含子元素,也不能有属性。XML Schema推荐标准内置了44种简单类型,如例4-6、例4-8中的xs:string、xs:integer等,这些简单类型可以直接引用。XML Schema内置的数据类型的层次结构如图 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: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属性指定要限制的基类型

复杂类型

具有复杂类型的元素可以有子元素和属性。复杂类型使用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>

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

分享到:
评论

相关推荐

    XML详解----Schema(精讲)

    XML_schema_详解 XML Schema是XML文档的约束机制,用于定义XML文档的结构和内容。它是XML 1.0规范的一部分,提供了一个强大的工具来描述和验证XML文档。 XML Schema的优点是: * 强大的描述能力:XML Schema可以...

    XML的Schema详解

    XML Schema详解.ppt这个文件很可能包含了详细的PPT讲解,涵盖了XML Schema的基础概念、语法、实例分析和最佳实践等内容。通过深入学习这个PPT,你可以更好地理解和掌握XML Schema的使用,提升XML文档的管理和开发...

    XML Schema教程

    ### XML Schema 教程知识点详解 #### 一、XML Schema 概述 - **XML Schema 定义**:XML Schema 是一种基于 XML 的语言,用于描述 XML 文档的结构。它定义了 XML 文档中可以出现的元素、属性及其结构,并且指定了...

    XML Schema参考手册

    ### XML Schema 参考手册知识点详解 #### 一、XML Schema 概述 **XML Schema** 是一种标准化的工具,用于定义 **XML** 文档的结构。它是一种基于 **XML** 的 **DTD** (Document Type Definition) 替代方案,能够...

    XML XML Schema XSLT 2.0和XQuery开发详解源代码.rar

    这个压缩包“XML XML Schema XSLT 2.0和XQuery开发详解”包含了与这些技术相关的源代码示例。这些示例通常会涵盖以下方面: 1. **XML文档结构**:示例可能包括不同类型的XML文档,展示如何创建符合XML语法规则的...

    xml schema的内置类型

    XML Schema 内置类型详解 XML Schema 内置类型是 XML 文档中使用的基本数据类型,它们可以分为基础类型和派生类型两类。基础类型是解析系统直接支持的原始类型,而派生类型是对基础类型或其他内置派生类型加以限制...

    xmlschema:适用于Python的XML模式验证器和数据转换库

    **XMLSchema库详解** XMLSchema(XML Schema)是一种用于定义XML文档结构和数据类型的规范,它为XML提供了形式化的语义定义。在Python编程环境中,有许多库用于处理XML,但`xmlschema`库是一个专门针对XML Schema的...

    xml实用教程_XML_Schema结构

    &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt; &lt;/xs:schema&gt; ``` 在这个XML Schema中: - 定义了一个`book`元素,它包含了多个子元素如`title`、`author`、`price...

    Java通过XML Schema校验XML

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3school.com.cn file:///D:/_dev_stu/xsdtest/src/note.xml"&gt; &lt;to&gt;George &lt;from&gt;John &lt;heading&gt;Reminder &lt;body&gt;Don'...

    Java Web开发详解:XML+DTD+XML Schema+XSLT+Servlet3.0+JSP2.2深入剖析与实例应用/孙鑫编著

    鑫编写的《Java Web开发详解——XML+DTD+XML Schema+XSLT+Servlet3.0+JSP2.2深入剖析与实例应用》共分4篇,从XML、XML Schema、XSLT、Servlet、JSP和应用的角度向读者展示了Java Web开发中各种技术的应用,循序渐进...

    XML Schema .ppt

    XML Schema(XML Schema Definition,通常缩写为XSD)是一种用于定义XML文档结构和数据类型的标准化语言,由W3C(万维网联盟)制定。它提供了比早期的DTD(Document Type Definition)更强大的功能,特别是在处理...

    XML Schema to Ecore Mapping

    &lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt; &lt;/xs:schema&gt; ``` 根据上面的映射规则,导入到EMF后,将生成一个名为`PersonType`的`EClass`,其中包含一个名为`name`的`EAttribute`和一个...

    XML_Schema 教程 详细版

    ### XML Schema 教程知识点详解 #### 一、XML Schema 简介 XML Schema是一种用于描述XML文档结构的语言,被视为DTD(Document Type Definition)的替代品,具有更丰富的特性和更高的灵活性。XML Schema(也常称为...

    XML schema结构快速参考

    - **http://www.w3.org/2001/XMLSchema-instance**:这个名称空间用于表示XML Schema实例文档中的特殊属性,如`xsi:type`。 #### 三、Schema声明 Schema声明是定义XML文档结构的基础。一个完整的`&lt;schema&gt;`元素...

    XML Schema

    ### XML Schema核心知识点详解 #### 一、XML Schema概述与应用价值 XML Schema是一种用于定义XML文档结构和内容的有效工具,由W3C组织制定。它不仅提供了强大的功能来规范XML文档,还允许开发者通过一系列复杂的...

    扩展XML Schema Validator--MSV

    **扩展XML Schema Validator--MSV详解** XML(eXtensible Markup Language)作为一种标记语言,广泛应用于数据交换、配置文件存储等领域。为了确保XML文档遵循特定的结构和规则,XML Schema(XSD)应运而生,它为...

    AUTOSAR_TR_XMLSchemaSupplement.zip.zip

    2. **XML Schema详解**:文件可能包含了XML Schema在AUTOSAR中的详细使用方法,包括如何定义数据类型、元素和属性,以及如何约束和验证XML文档,以确保其符合AUTOSAR标准。 3. **AUTOSAR数据交换**:XML Schema在...

    XML应用开发(软件品牌)-1期 第3单元 单元测试卷-XML Schema应用.doc

    &gt;&lt;xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"&gt;&lt;xs:element name="CheckTime" type="xs:time"/&gt;&lt;/xs:schema&gt;A、&lt;CheckTime&gt;10:30:00 AM&lt;/CheckTime&gt;B、&lt;CheckTime&gt;10:30:00&lt;/CheckTime&gt;C、&lt;CheckTime&gt;10...

    xml(schema定义)

    ### XML Schema 定义详解 XML Schema是一种用于描述XML文档结构和内容的规范,它提供了比DTD(Document Type Definition)更强大的数据类型和结构控制能力。通过使用XML Schema,开发者可以定义XML文档中的元素和...

Global site tag (gtag.js) - Google Analytics