?XML Schema

通过前面的学习,大家都知道浏览器可以自动验证XML文档的良好性,可以创建DTD文件验证XML文档的有效性。但是有许多常用的限制不能用DTD来表述,这就促使Schema(大纲)诞生。Schema与DTD相比,有一个明显的好处是XML Schema文档本身也是XML文档,而不是像DTD一样使用特殊格式。这大大方便了用户和开发者,因为可以使用相同的工具来处理XML Schema和其他XML信息,而不必专门为Schema使用特殊工具。DTD对用户来说是一种神秘的黑色艺术,Schema却简单易懂,人人都可以立刻理解。
在本章中,首先概述性地介绍了XML Schema,使读者迅速消除Schema的神秘感,从而对它在整体上有所把握。然后通过具体的实例,介绍如何编写XML Schema,包括其元素、属性类型的定义,注释的编写,使用其他大纲等内容。

10.1? XML Schema概述

在本节中主要对Schema进行概念上的介绍,其中包括使用Schema的必要性以及Schema的优越性,Schema的新特色是什么以及Schema的应用领域等问题。使读者能从整体上把握Schema。

10.1.1? 为什么需要Schema

通过前面的学习,大家到知道XML语言有其严格的规范,以适应广泛的应用。XML文档必须符合XML的语法限制。与此同时,在特定的应用中,数据本身有含义上、数据类型上、数据关联上的限制,也就是语义限制,这是一个值得讨论的问题。
例如在FOML(一种描述数学公式的XML)中,每种函数都有其特定的组成部分,积分函数必须包含积分上限、积分下限和被积分项,同时不能包含其他非法成分,这种限制不是XML语法所能规定的,必须用其他方式告诉用户和计算机。
XML在当今的IT行业中,被赋予了越来越多的职责和功能。例如,作为文本数据库存储数据,作为某一行业中数据交换的标准表示等。这些都需要相应的XML文件中对数据的描述,如数据类型、长度进行严格的定义,这样才能真正做到数据的安全性和行业统一标准,并有通用的规则对其进行解析。然而,XML在其产生的时候就被定义为高开放性,用文本方式浏览,用标签来定义的标记语言,鉴于XML的这些特点,就像HTML文件一样,XML文件本身无法对文件中的数据进行严格定义。
XML Schema正是在这种情况下应运而生的,它可以用来定义XML文件的文本结构、数据类型等XML文件描述规则的。

10.1.2? Schema的诞生

Schema曾被微软使用过,他们发展了一套不同于DTD方法来定义XML数据类型,并给出了自己的定义。可以说,微软的Schema启发了一种很好的思想,并成为现今的W3C定义Schema的原型。但是,W3C的Schema与微软的Schema是不同的,它是在W3C的专家们充分讨论和论证的基础上产生的。在1999年2月15日,W3C发布了一个需求定义,说明了新定义的Schema必须符合的要求。1999年5月6日,W3C完成并发布了Schema的定义。

10.1.3? XML Schema与DTD的区别

XML Schema与DTD都可以用来验证XML文档,那么到底什么时候使用XML Schema,什么时候使用DTD呢?在什么情况下使用什么技术,就看什么技术在短期内和长期情况下能给出最大的价值,这就有需要了解这两种技术之间的区别。下面就对这两种技术之间的区别进行简单的介绍。
1.语法的区别
DTD有自己的特殊语法。而XML Schemas是XML文档,它是用XML写的。这就给用户带来了如下三个好处:
(1)只要了解简化的XML数据(XML-data Reduced)的语法规则,无需知道两种语法来编写语法合格的XML Schema,而且不需要担心两套语法合格规则。
(2)软件工具可以利用XML文档和Schemas之间语法通用这一优点为两者提供支持。也就是说掌握了一种语法就可以为另一种语法建立支持也是挺容易的。例如支持操作XML文档的分析器也能用来操作Schemas,但是DTD不能以同样的方式操作。
(3)XML Schemas能够扩展开来,能向XML schemas中加入元素和属性。只要元素和属性名域不同,它们在一个Schema中是合法的。而DTD将无法解析扩充的内容。

2.数据类型的区别

DTD只允许把内容类型定义为一个字符串。而XML schemas允许把内容类型定义为整型、浮点型、数据型、布尔型或者许多其他的简单数据类型。如果想要编写一个应用软件来处理那个元素的内容,并且需要那个元素的值为整数,在DTD中,必须把它转化成一个整数,而在Schema中,可以直接得到那个整数值。

3.是否支持名域

XML Schema利用名域将文档中特殊的节点与Schema说明相联系,一个XML文件可以有对应多个Schema。而如果使用DTD的话,一个XML文件只能有一个与之相对应的DTD。

10.1.4? XML Schema的优越性

XML Schema与DTD相比,有如下的优越性:
(1)丰富的数据类型:它们包括布尔型、数字、日期时间、URIs整数、十进制数、市属、时间间隔等。而且它还支持由这些简单的类型生成复杂的类型。
(2)有由用户定义的数据类型:由用户定义的数据类型被称为Archetypes(原型)。例如可以先定义PostalAddress这个数据类型,然后定义ShippingAddress和BillingAddress,是这个类型的两个元素。
(3)属性(Attribute)分组:属性的应用范围是多种多样的,有的是所有元素都有的,有的是专门为图形元素设定的,为了表明这些关系,在DTD中我们是用参数体实现的。
(4)可修改的Archetypes(原型):可修改的Archetypes是最重要的特色。DTD定义的内容模式是封闭的,而XML Schema定义的是开放的、可修改的。
10.1.5? Schema的应用领域
Schema的应用领域包含如下一些。

  • 电子商务
  • 网络信息传递与监控
  • 信息出版与共享
  • 文档归类
  • 元数据交换
  • 数据库与应用程序的信息交换

大到英特网,小到XML和Schema,都正处于飞速发展与变化中。Schema的概念提出已久,但W3C的标准最近才出来,相应的应用支持正在完善之中。但Schema乃XML发展之大势所趋,必将得到广泛应用。
10.2? 使用XML Schema
在本节中,将具体介绍Schema的格式,元素、属性类型的定义、元素组、archetypes以及如何使用其他大纲中的定义等内容。
10.2.1? Schema的格式
通过本章前面的学习,大家知道XML Schema本身也是一个XML文件,所不同的是,Schema文件所描述的是对引用它的XML文件的元素和属性的具体类型的。作为一个Schema文件,其特殊的文件头格式为如下所示:
<?xml version="1.0"?>
<Schema name="schema_sample_1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<!--…………..-- >
</Schema>
其中<?xml version="1.0"?>是XML文件的文件头;Schema name="schema_sample_1"是一个名称,在一般的情况下,该名称可以省略;xmlns="urn:schemas-microsoft- com:xml-data",它是引用微软Schema类型定义,在一般情况下也是可以省略的;xmlns:dt="urn:schemas-microsoft-com:datatypes"> ,它也是引用微软Schema数据类型定义,在一般情况下也是可以省略的;<!--…………..-- >标识具体的文件内容。
大纲的元素名表明这是一个大纲,“xmlns”是一个名域声明,它标明大纲元素由称作“urn:schemas-microsoft-com:xml-data”的规范明确定义,因而有别于其他任何类似名称的元素。
在前面介绍XML语法时,曾经说过XML文档中只能有一个根元素。在一个定义Schema的XML文件中,必须注意的是,文件的根一定为<Schema>… </Schema>。
在文件的具体内容中,可以添加对某个XML结构、数据类型的定义。
10.2.2? 元素
先来看一个XML文档,下面所介绍的内容是以它为基础的。其代码如下所示:
<book>
<title>中风的防治与康复</title>
<authors>
<author>
<name>吴运泉</name>
<phone>0730-4848764</phone>
<EMail>wuyunquan@263.net</EMail>
<Fax>0730-1258456</Fax>
</author>

????? <author>
<name>马秀琴</name>
<phone>0732-4844464</phone>
<EMail>maxiuqin@263.net</EMail>
<Fax>0732-1247696</Fax>
</author>
</authors>
<press>
<appellation>科学出版社</appellation>
<city>北京</city>
<postcode> 100717</postcode>
<state>东黄城根北街16号</state>
</press>
<price>12.000</price>
<Printdate>2000.07.11</Printdate>
<impression>10000</impression>
<resume>脑是智慧的源泉。中风是破坏大脑的罪魁祸首,是埋在体内的定时炸弹。一旦发生中风,轻者致残,重者致命,对健康危害极大,生命质量大为降低。然而,中风是可以预防或推迟发生的,其行之有效的方法就是学习、认识此病的病因,掌握一些预防方法。人人都来关心自己,关心亲人,静下心来学点医学科普知识,懂得一些预防措施,让中风远离我们,让我们生活得更美好。本书原名是《中风防冶新法手册》,由于该书所用资料新颖,信息量大,内容丰富,图文并茂,深入出,通俗易懂,具有严格的科学性和浓厚的趣味性,因此,不仅受到国内读者的好评,而且受到港台同胞、国外(美国、加拿大、新加坡等)华侨的欢迎,这些使我们深受鼓舞。此次应科学出版社《生活与科学文库》组之邀,将该书进行修订和删补。为了使读者更好理解,本书增加了眼中风、脊中风等疾病,康复部分增加了饮食疗法、性生活康复,这些都是读者希望增加的内容。
</resume>
</book>
ElementType是Schema中最基本的,它用来定义XML文件中元素的格式,数据类型等。
book包括几种元素,ElementType是定义它们的机制。例如能够使用下面的代码定义一个简单元素类型title:
<ElementType name="title" />
更复杂的元素不仅仅包括文字,它们可能包括特定形式的文本或者包含其他元素的文本。例如在本例中想规定Printdate元素为日期,可以使用如下所示的代码。
<ElementType name=" Printdate " dt:type="date" />
在元素的定义中引用了其他的适当的元素类型,例如使用如下所示的代码使press元素包括其他元素:
<ElementType name="press" />
<element type="appellation" />
<element type="city" />
<element type="postcode" />
<element type="state" />
</ElementType>
这表示每当press元素出现,其中必须有四个子元素,依次是appellation,city,postcode和state,当然需要在此之前就定义这些元素。在本例中使用了如下所示的代码定义它们:
<schema xmlns="urn:schema-microsoft-com:xml-data"
xmlns:dt="urn:schema-microsoft-com:datatypes">
<ElementType name="book">
<ElementType name="title"/>
<Element type="author"/>
<Element type="press"/>
<Element type="price" />
<Element type="Printdate"/>
<Element type="impression " />
<Element type="resume" />
</ElementType>

?? <ElementType name="title" />
<ElementType name="authors">
<Element type name="author"/>
</ElementType>
<ElementType name="author">
<Element type="name" />
<Element type="phone" />
<Element type="EMail" />
<Element type="Fax" />
</ElementType>

<ElementType name="name" />
<ElementType name="phone" />
<ElementType name="EMail" />
<ElementType name="Fax" />
<ElementType name="press">
<Element type="appellation"/>
<Element type= "postcode"/>
<Element type="city"/>
<Element type="state"/>
</ElementType>
<ElementType name="appellation"/>
<ElementType name="city"/>
<ElementType name="postcode"/>
<ElementType name="state"/>
<ElementType name="price" dt:type="fixed.14.4"/>
<ElementType name="Printdate" dt:type="date"/>
<ElementType name="impression " dt:type="int"/>
<ElementType name="resume" />
</schema>

以上代码可以在Dreameaver 4代码视图窗口进行编辑(在编辑以上代码以前,必须将所有的其他代码删除),从以上代码中可以看出,定义一个ElementType的基本格式


[下一页]