XML Schema

xml

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

什么是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片段是合法的:

下面的XML片段是非法的:



回页首

Schema中的类型

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

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

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



回页首

简单类型

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

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

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



回页首

所有内建的简单类型

原始类型

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



回页首

创建简单类型

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

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



回页首

简单类型的例子 1

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

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



回页首

简单类型的例子 2

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

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



回页首

列表类型

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



回页首

联合类型

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

匿名类型定义

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

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



回页首

复合类型

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

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



回页首

混合内容

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

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



回页首

空内容

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

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

还要更简洁的方法定义:

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



回页首

anyType

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

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



回页首

注释

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

图中,我们在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元素的声明,这样空值就能够被明确地告知用户了。

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



回页首


回页首

关于作者

IBM has authored this article

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索xml
, schema
, 数据类型
, 类型
, 简单
, 元素
简单数据类型
,以便于您获取更多的相关知识。

时间: 2025-01-02 16:11:21

XML Schema的相关文章

XML Schema学习初体会

xml 最近埋头苦读WMFC定义的接口1标准文档,其中对XML格式的定义都使用了XML Schema,由于XML Schema在很多方面都有很大的作用,大有取代DTD的趋势,所以在此写了一些学习笔记,有疏漏的地方请大家指正! XML Schema的其他方面偶就不在这里罗嗦了,直接进入主题,关于XML Schema的基本语法. XSDL(XML Schema定义语言)由元素.属性.命名空间和XML文档种的其他节点构成的. 一.XSD中的元素 XSD文档至少要包含:schema根元素和XML模式命名

XML Schema帮你建模(2)

xml 复合类型定义.元素和属性声明   在XML Schema中,对于那些允许元素有自己的内容,以及可以携带自身属性的复合类型与那些不能够有元素内容和属性的简单类型,它们的表示形式有着本质的不同.在实例文档中,对于能建立新的类型(无论简单和复杂)的定义和允许元素和属性有特定的名字和类型(无论是简单还是复杂)的声明,它们之间也有着显著的差别.在这一节中,将针对如何定义复合类型,以及如何声明使用复合类型的元素及其属性做较详细的描述.   在一个模式文档中,当需要定义新的复合类型的时候,应当使用co

XML Schema帮你建模(4)

xml 列表类型  除了使用简单类型中描述的原子类型(这些原子类型可用于组合成绝大多数的其它类型,包括其它的简单类型和复合类型)外,XML Schema中在简单类型范畴中还有列表类型(List Type)的概念.原子类型.列表类型以及联合类型,总称为简单类型.一个原子类型的值在XML Schema中是不可分割的.举例来说,NMTOKEN值US是不可分割的,US的任何部分,如字母S本身都是没有意义的.与之相比较,列表类型则是由一组原子类型组成,因此它的每一个部分(原子)本身都是有意义的.举例来说N

XML Schema帮你建模(3)

xml 命名冲突  我们现在已经讨论了如何定义新的复合类型(比如PurchaseOrderType).声明元素(比如purchaseOrder)和声明属性(如orderDate).在这些定义行为中,一般都包含着命名,如果我们给两个对象赋予同样的名称会有何种结果? 答案取决于问题中的两个对象,一般来说这两个对象越相近,它们越有可能引起冲突.   下面,我们给出一些例子来说明什么时候同样的名称会导致问题.如果两个对象都是类型,而且定义了一个复合类型为USStates,同时又定义了一个简单类型为USS

XML Schema帮你建模(1)

xml  XML Schema是2001年5月正式发布的W3C(万维网联盟)的推荐标准,经过数年的大规模讨论和开发如今终于奠定下来,成为全球公认的XML环境下首选的数据建模工具.  由于XML是SGML(标准通用标示语言)的一个子集,它也继承了SGML用于建模的DTD.使用DTD的好处是可以利用大量现有的DTD工具,使得开发应用代价维持在一个相对较低的水平.然而,DTD有不少缺陷:   1. DTD是基于正则表达式的,描述能力有限:   2. DTD没有数据类型的支持,在大多数应用环境下能力不足

一个简单的XML Schema的例子

xml 我们可以看到,DTD的语法相当复杂,并且它不符合XML文件的标准,自成一个体系.也就是说DTD文档本身并不是一个良好形式的XML文档,上面的关于DTD的介绍也仅仅是作了一个简介,目的是帮助大家能读懂DTD文件以及在必要时创建简单的DTD文件,因为现在很多的XML应用是建立在DTD之上的.另外一个代替DTD的就是W3C定义的Schema,Schema从字面意义上来说,可以翻译成模式.大纲.计划.规划等等.它的基本意思就是说为XML文档制定一种模式. Schema相对于DTD的明显好

手工编写一个XML Schema(XSD)的实例

简单说:xml Schema就是xml的一个class,也相当于关系表的表结构模式.目前大都可以由程序根据已有的xml自动生成它的xsd,或者根据关系表生成它相应的xsd(实际就是将关系数据转换成xml数据,Vs2005中的类型化的Dataset就是这样实现的). 对xml Schema做一些简单了解还是很有益处的. XML Schema用于描述XML文档结构的文件.XML Schema有时又称为XML Schema Definition,所以也会称为XSD.因此Schema文件是以xsd为后缀

XML的中阶知识巩固之XML Schema其一

用过 XML 的人都知道可用 DTD(Document Type Definition) 来验证语法,不过微软主导了新一代验证语法的 XML Schema,并且风头正劲,大有一统江湖之势.看看我们身边的几个变化就明白了. web.xml 从 web-app_2_3.dtd 到 web-app_2_4.xsd spring 配置文件从 spring-beans.dtd 到 spring-beans-2.0.dtd 到 spring-beans-2.0.xsd,直至灵活的自定义 Schema qua

W3C XML Schema与文档类型定义(DTD)比较

许多开发者都期待着 XML 模式能够很快取代 DTD 用于指定 XML 文档类型.尽管 David Mertz 相信 XML 模式在开发者宝库中是一种无价工具,但他对该模式将替代 DTD 持怀疑态度."XML 问题"专栏的这一部分逐步尝试对模式和 DTD 进行比较,并阐明在 XML 模式世界中发生的事件. 虽然 W3C XML Schema在许多场合中胜过 DTD,但仍然还有一些 DTD更胜一筹的领域.开发者要不断地进行艰难的选择(这在 XML世界中是司空见惯的事).让我们开始对其中一