`
躁动的绵羊
  • 浏览: 96179 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XML教程——XML Schema

阅读更多

什么是XML Schema

XML Schema如同DTD一样是负责定义和描述XML文档的结构和内容模式。它可以定义XML文档中存在哪些元素和元素之间的关系,并且可以定义元素和属性的数据类型。

XML Schema本身是一个XML文档,它符合XML语法结构。可以用通用的XML解析器解析它。


为什么要使用Schema

我们前面已经使用DTD来定义一个XML的结构和数据类型,那为什么还要Schema呢?

因DTD有着不少缺陷:

1) DTD是基于正则表达式的,描述能力有限;
2) DTD没有数据类型的支持,在大多数应用环境下能力不足;
3) DTD的约束定义能力不足,无法对XML实例文档作出更细致的语义限制;
4) DTD的结构不够结构化,重用的代价相对较高;
5) DTD并非使用XML作为描述手段,而DTD的构建和访问并没有标准的编程接口,无法使用标准的编程方式进行DTD维护。

而XML Schema正是针对这些DTD的缺点而设计的,XML Schema的优点:

1) XML Schema基于XML,没有专门的语法
2) XML可以象其他XML文件一样解析和处理
3) XML Schema支持一系列的数据类型(int、float、Boolean、date等)
4) XML Schema提供可扩充的数据模型。
5) XML Schema支持综合命名空间
6) XML Schema支持属性组。


一个简单的XML Schema文档


在这个Schema里面定义了一个元素:quantity,它的类型是nonNegativeInteger(非负整数),xmlns是Schema的命名空间,这在前面第3部分已经叙述过了。

下面的XML片段是合法的:

<quantity>5</quantity>

下面的XML片段是非法的:

<quantity>-4</quantiy>

Schema中的类型

Schema中主要包括三种部件:元素(element)、属性(attribute)、注释(notation)。

这三种基本的部件还能组合成以下的部件:

a)类型定义部件: 简单类型和复合类型
b)组部件
c)属性组部件


简单类型


XML Schema中定义了一些内建的数据类型,这些类型可以用来描述元素的内容和属性值。

一个元素中如果仅仅包含数字、字符串或其他数据,但不包括子元素,这种被称为简单类型。

如同图中元素quantity就是一个简单类型。它的元素内容必须是非负整数,不包括任何属性和子元素。

<quantity>some</quantity>

所有内建的简单类型

原始类型

string,boolean,decimal,float,double,duration
datetime,time,date,gYearMonth,gYear,gMonthDay,
dDay,gMonth,hexBinary,base64Binary,any URI,QName
NOTATION

衍生类型(括号中为基类型)

normalizedString(string),language(tonken),token(normalizedString)
NMTOKEN(token),Name(token),NCName(Name),ID(NCName),IDREF(NCName)
IDREFS(list of IDREF),ENTITY(NCName),ENTITIES(list of ENTITY)
integer(decimal),nonPositiveInteger(integer),
negativeInteger(noPositiveInteger),long(integer),int(long),
short(int),byte(short),nonNegativeInteger(integer)
unsignedLong(nonNegativeInteger),unsignedInt(unsignedLong),
unsignedShort(unsignedInt),unsignedByte(unsignedShort),
positiveInteger(nonNegativeInteger)

创建简单类型


图中我们先创建了一个简单类型:quantityType,它是从integer继承过来的,minInclusive和maxInclusive定义了它的最小值2和最大值5。最后我们定义元素quantity的类型为quantityType。

正确:	<quantity>3</quantity>
错误:	<quantity>10</quantity>
<qauntity>aaa</quantity>

使用restriction我们可以限制只能接受一定数值或者只能接受一定文字,

基本方面:equal,ordered,bounded,cardinality,numeric
限制方面:length,minLength,maxLength
pattern,enumeration
whiteSpace
maxInclusive,maxExclusive,minInclusive,minExclusive
totalDigits,fractionDigits

简单类型的例子 1


这个SKU的类型的取值:3个数字后面根着一个连字号接着跟着两个大写的英文字母。

pattern后面跟的是正则表达式。有关正则表达式的语法请参阅其他书籍。

正确:	<ourSKU>123-AB</ourSKU>
错误:	<ourSKU>abc-AB</ourSKU>
<ourSKU>123-ab</ourSKU>

简单类型的例子 2


这是一个用来描述美国州名的类型USState,通过enumeration来列出所有州名,取值时就只能取里面列出的州名。

<!-- and so on ...-> 这是一个注释语句。

正确:	<statename>AK</statename>
错误:	<statename>Alaska</statename>

列表类型


list可以用来定义列表类型,listOfIntType这个类型被定义为一个Integer的列表,元素listOfMyInt的值可以几个整数,他们之间用空格隔开。

正确: <listOfMyInt>1 5 15037 95977 95945</listOfMyInt>
错误: <listOfMyInt>1 3 abc</listOfMyInt>

联合类型


图中用union来定义了一个联合类型,里面的成员类型包括USState和listOfMyIntType,应用了联合类型的元素的值可以是这些原子类型或列表类型中的一个类型的实例,但是一个元素实例不能同时包含两个类型。

正确:	<zips>CA</zips>
<zips>95630 95977 95945</zips>
<zips>AK</zips>
错误:	<zips>CA 95630</zips>


匿名类型定义

前面我们在定义元素类型时总是先定义一个数据类型,然后再把元素的type设成新定义的数据类型。如果这个新的数据类型只会用一次,我们就可以直接设置在元素定义里面,而不用另外来设置。如图中元素quantity的类型就是一个从1到99的整数。

这种新的类型没有自己的名字的定义方法我们称之为匿名类型定义。


复合类型


前面我们所讲到的都是属于简单类型,即元素里面只有内容,不再包括属性或者其它元素。接下来我们要让元素里面包含属性和其它元素,称之为复合类型。

图中我们用complexType表示这是一个复合类型(这里我们是用匿名类型定义的)。simpleContent表示这个元素下面不包括子元素,extension表示这个元素值是decimal的,attribute来设置它的一个属性currency,类型为string.

正确:<internationalPrice currency="EUR">423.46</internationalPrice>

混合内容


同样,我们采用了匿名类型方式来定义一个元素salutation。我们注意到在complexType后面多了一个mixed="true",这表明这是一个混合类型:里面既有元素本身的内容,又有其它子元素。name元素就是salutation的子元素。

正确:	<salutation>Dear Mr.<name>Robert Smith</name>.</salutation>
错误:	<salutation>Dear Mr.</salutation>

sequence表示子元素出现的顺序要和schema里面的顺序一样。我们在后面还会讲到和sequence对应的choice和all两种方式。


空内容


有的时候元素根本没有内容,他的内容模型是空。为了定义内容是空的类型,我们可以通过这样的方式:首先我们定义一个元素,它只能包含子元素而不能包含元素内容,然后我们又不定义任何子元素,依靠这样的方式,我们就能够定义出内容模型为空的元素。

图中complexConet表示只包含子元素,然后我们定义了两个属性currency和value,但是却不定义任何子元素。

正确:
<internationalPrice currency="EUR" value="423.46"/>
错误:
<internationalPrice currency="EUR" value="423.46">
Here is a mistake!
</interanationPrice>

还要更简洁的方法定义:

<xsd:element name="internationalPrice">
<xsd:complexType>
<xsd:attribute name="currency" type="xsd:string"/>
<xsd:attribute name="value" type="xsd:decimal"/>
</xsd:complexType>
</xsd:element>

因为一个不带有simpleContent 或者complexContent的复合类型定义,会被解释为带有类型定义为anyType的complexContent,这是一个默认的速记方法,所以这个简洁的语法可以在模式处理器中工作。


anyType


一个anyType类型不以任何形式约束其包含的内容。我们可以象使用其他类型一样使用anyType,如图第一个语句,这个方式声明的元素是不受约束的。所以元素的值可以为423.46,也可以为任何其他的字符序列,或者甚至是字符和元素的混合。实际上,anyType是默认类型,所以上面的可以被重写为第二个语句。

如果需要表示不受约束的元素内容,举例来说在元素包含散文,其中可能需要嵌入标签来支持国际化的表示,那么默认的声明(无约束)或者有些微约束的形式会很合适。


注释


为了方便其他读者和应用来理解模式文档,XML Schema提供了三个元素用来注释。

annotation
documentation
appinfo

图中,我们在documentation元素中放置了一个基本的模式描述和版权信息,这是放置适合人阅读的信息的推荐位置。我们推荐你在任何的documentation元素中使用xml:lang属性来表示这些描述信息使用的语言。


构造内容模型


图中,我们在purchaseOrderType定义中引入两个元素组定义,购买订单就可以有两种选择来描述地址:第一种是包含彼此独立的送货地址和收款地址,第二种情况则是仅包含一个简单的地址,这个地址即是送货地址也是收款地址.

对于choice组元素而言,在实例中仅仅允许出现这个组中的一个子内容。对于图中的例子而言,第一个子内容是一个内部group元素,引用以shipAndBill命名的元素组,这个元素组由元素序列shipTo、billTo组成。第二个子内容为singleUSAddress。因此,在一个实例文档中,purchaseOrder元素必须,要么包含一个billTo元素和一个shipTo元素,要么包含一个singleUSAddress元素。

choice组后面跟着的是comment和items元素声明。元素和组的声明都是sequence 组的子内容。这样定义的效果是comment和items元素必须按顺序跟在地址元素后面。

在内容模型中被命名或未被命名的元素组(分别由group、choice、sequence、all所表现)可以带有minOccurs 和maxOccurs属性


属性组


我们可以建立一个被命名的属性组来包含所有item元素所期望的属性,并且在item元素声明中通过名字来引用这个属性组ItemDeleivery

通过这种方法来使用属性组,可以提高模式文档的可读性,同时也便于更新模式文档。这是因为一个属性组能够在一个地方定义和编辑,同时能够在多个定义和声明中被引用。注意到一个属性组可以包含其他属性组,同时还要注意到属性组的声明和引用必须在复合类型定义的最后。


空值(Nil)


XML Schema 空值机制包括一个空值信号。换句话说,作为元素内容而言,并没有没有真正的空值,代之的是一个说明元素的内容是空值的属性。为了显示这点,我们修改shipDate元素的声明,这样空值就能够被明确地告知用户了。

<xsd:element name="shipDate" type="xsd:date" nillable="true"/>

为了在实例文档中明确的表示shipDate有一个空值,我们可以设置nil属性为真:

<shipDate xsi:nil="true"></shipDate>

<!-- CMA ID: 162353 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->

 

 

参考文章: http://www.ibm.com/developerworks/cn/xml/x-cert/part6/index.html

分享到:
评论

相关推荐

    xml实用技术教程—— 顾兵

    本教程“XML实用技术教程——顾兵”深入浅出地介绍了XML的基本概念、语法规范以及在实际应用中的技巧。 一、XML基础 1. XML结构:XML文档由元素、属性、文本、注释和处理指令等组成。元素是XML的核心,用于定义...

    XML学习教程——PHP资源

    6. **XML Schema**:XML Schema是W3C推荐的XML文档结构验证工具,比DTD更为强大,支持数据类型、复杂结构和更复杂的约束。 7. **XML解析器**:XML解析器负责读取XML文档并将其转换为程序可以处理的形式。有两种主要...

    XML快速入门教程——韦斯利著

    ### XML快速入门教程知识点概述 #### 一、XML简介 - **定义与作用**:可扩展标记语言(Extensible Markup Language,简称XML)是一种用于标记数据的语言,它被设计用来传输和存储数据。XML的数据是自描述性的,这...

    AUTOSAR_MMOD_XMLSchema.zip

    标题中的"AUTOSAR_MMOD_XMLSchema.zip"指的是一个与AUTOSAR(AUTomotive Open System ARchitecture)相关的压缩包文件,它包含了MMOD(Model-based Modeling and Development)的XML Schema定义。AUTOSAR是一种全球...

    《无废话XML》——两只老虎

    - **XML Schema**:另一种更强大、更灵活的验证机制,提供了比DTD更多的功能。 #### 1.3 XML的相关技术 ##### 1.3.1 SGML - **SGML (Standard Generalized Markup Language)**:标准通用标记语言,是XML的父标准...

    XML解析器————

    3. **XML Schema支持**:Xerces-J支持XML Schema,允许对XML文档进行结构化验证,确保其符合预定义的模式规范。 4. **DTD支持**:除了XML Schema,Xerces-J还支持Document Type Definitions (DTD),这是较早的一种...

    JavaEE5实用教程——基于WebLogic和Eclipse程序源代码

    综上所述,"JavaEE5实用教程——基于WebLogic和Eclipse程序源代码"涵盖了从基础组件到高级特性的广泛内容,旨在帮助开发者利用JavaEE5的简化特性,结合WebLogic Server的稳定性和Eclipse的高效开发工具,创建高质量...

    网站建设——XML教程CHM

    在"网站建设——XML教程CHM"中,可能涵盖了以下内容: 1. XML基础:解释XML的基本结构、语法和命名规则,包括元素、属性、实体、注释等概念。 2. DTD和XML Schema:介绍如何使用这两种验证工具来定义XML文档的结构...

    xml技术指南——————宝典

    - **XSD(XML Schema)**:更现代的替代DTD,提供了更强大的数据类型和约束定义能力。 - **XPath**:一种在XML文档中查找信息的语言,用于选取节点或节点集。 - **XSLT(Extensible Stylesheet Language ...

    PyPI 官网下载 | xmlschema-0.9.17.tar.gz

    《PyPI上的Python库——xmlschema-0.9.17》 在Python的世界里,PyPI(Python Package Index)是官方的软件仓库,它为开发者提供了大量的第三方库,极大地丰富了Python的功能。今天我们要讨论的是PyPI上的一款名为...

    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教程(第二版),对xml的知识做了深入细致的讲解。

    XML的设计目标是传输和存储数据,而不是显示数据,这与HTML(超文本标记语言)的主要目标——展示内容有所不同。本教程“实战XML教程(第二版)”深入浅出地探讨了XML的各种核心概念和技术,旨在帮助读者掌握XML的全面...

    C# XML入门经典 —— C#编程人员必备的XML技能

    2. DTD与XML Schema:DTD(Document Type Definition)和XML Schema用于定义XML文档的结构和约束。DTD是较早的定义方式,而XML Schema提供更强大、更灵活的数据类型支持。 二、C#解析XML 1. XmlDocument类:C#中,...

    XML初学进阶——XML基础帮手

    6. **文档类型定义(DTD)与XML Schema**:DTD和XML Schema是两种验证XML文档是否符合规范的方法。DTD使用类似XML的语法来定义元素和属性的规则,而XML Schema使用更强大的数据类型系统,提供更精细的结构控制。 7....

    PyPI 官网下载 | xmlschema-1.2.4-py3-none-any.whl

    在本资源中,我们讨论的是一个名为"xmlschema"的Python库的特定版本——1.2.4。这个库主要功能是处理XML数据,它提供了对XML Schema标准的完整实现。XML Schema是一种用于定义XML文档结构和数据类型的语言,它为XML...

    征服Spring AOP—— Schema

    本文将深入探讨“Spring AOP——Schema”,这是Spring AOP的一种配置方式,通过XML schema定义切面和通知。 首先,我们需要理解AOP的基本概念。面向切面编程是一种编程范式,旨在提高软件的模块化程度,将关注点...

    XML架构说明——XML架构说明

    XML架构定义语言(XML Schema Definition,简称XSD)是一种用于规范XML文档结构和数据类型的语言。它为XML提供了一个强大的类型系统,类似于编程语言中的类型系统,有助于确保数据的准确性和一致性。XSD允许开发者...

    C# XML入门经典——C#编程人员必备的XML技能(中文)

    3. **XML Schema(XSD)和DTD**:为了验证XML文档的结构是否正确,我们可以使用XML Schema或Document Type Definition (DTD)。XSD提供了更强大的数据类型和约束定义,而DTD则较为简单。 4. **C#中的XML操作**:在...

    Schama —— Xml文档约束技术 学习笔记

    学习XML Schema的过程中,可以参考《XmlSchema标准参考手册.chm》这样的资源。这份手册通常会详细介绍XML Schema的语法、元素和属性,以及如何创建和应用XML Schema定义文件(XSD)。其中可能包括以下内容: - **...

    在Delphi中使用SQL Server的XML特性 二——查询技术.pdf

    Delphi 中使用 SQL Server 的 XML 特性 —— 查询技术 Delphi 自从第一版开始就支持使用 BDE(Borland Database Engine)来连接数据库,直到后来的 Delphi 5/6 中使用 ADO(ActiveX Data Objects)来实现基于OLE ...

Global site tag (gtag.js) - Google Analytics