在创建XML文档时,只用格式正确的XML文件是不够的,必须配合DTD(Documents Type Definition,文档类型定义)来清楚地定义文件的格式。这样在数据自动化互传的过程中,XML解析器可以根据DTD,及时确认所收到的数据格式是否准确无误。如果有问题可以马上退回去,要求对方程序重新传递数据,或请对方填写数据的人修正数据后重新发送,这样就不会因无意中输入格式错误的数据,造成数据的破坏。
在本章中,首先介绍一些有关DTD的概述性问题,例如为什么要使用DTD、DTD到底是什么、DTD的未来在哪里等,然后介绍了如何使用Dreamweaver 4创建DTD文件,对XML文档进行有效性验证。
9.1? DTD概述
本节主要对DTD进行概述,其中包含了为什么要使用DTD、以及DTD的发展趋势等内容,让读者迅速消除对DTD的陌生感。
9.1.1? 为什么需要DTD
XML文档基本上可以分为两种情形,一种是有效的文档,另一种是创建良好的文档。创建有效的XML文档遵守某个特定的文档类型定义(DTD)。确认XML文档正确性的工作主要由制作出版工具承担,而XML浏览器为读取XML文档,只需要检查其构造的良好性。这样,制作工具中的解析器得要检查构造良好性和有效性,而浏览器仅要考虑寻找已经构造良好的XML。也就是说,浏览器只检查XML是否是构造良好,而不验证XML文档是否有效。
创建良好的XML文档遵守XML语法的一般规则,这些规则比HTML和SGML的规则更为严格。XML的字符数据决不能吊在那里,没有某种结束标识符,或者是像<tag1> </tag1> 成对出现的结束标识符,或者是一个特别的在右尖括弧前带有一个斜杠的空元素标记,比如<tag1/>。XML 标识总是以左尖括弧或&开始;元素类型和属性名称是大小写区分的;属性需要引号等。
<?xml version="1.0"? encoding="gb2312" ?>
<bookInformation xmlns:dt="urn:schemas-microsoft-com:datatypes">
<book>
<title>电子商务基础</title >
<author>唐春林</author>
<press>科学出版社</press>
<price dt:dt="number">24.80</price>
<resume >本书介绍电子商务的基础知识及涉及的主要技术,主要偏重于对电子商务的感性认识和参与电子商务的实践(配有相关的上机实践题),并给出了一些电子商务的成功案例。本书既可作为大、中专院校相关课程的参考教材,也可作为政府部门。各机关、企事业单位的"电子商务"培训教材。
</resume >
</book>
? <book>
<title> Flash 5 白皮书</title>
<author>张仁川</author>
<press>科学出版社</press>
<price dt:dt="number">61.00</price>
<resume >本书以精美的实例,向读者介绍Flash5的各种功能和操作技巧。图文对照、版式活泼是本书的重要特点,作者精心制作的实例定能引导您进入Flash的动画世界。本书适合于对Flash5感兴趣的读者和网页动画制作的爱好者。
</resume >
</book>
</bookInformation>
这不但是一个有效的文档,而且也是创建良好的文档。如果把最后的</bookInformation>删除,在浏览器中打开该文件,浏览器就会显示出如图9.1所示的错误信息,并指出错误的地方。

图9.1? 浏览器自动检查XML文档的良好性
下面再来看另一个XML文档,其源代码如下:
<?xml version="1.0"? encoding="gb2312" ?>
<bookInformation xmlns:dt="urn:schemas-microsoft-com:datatypes">
<book>
<title> OUTLOOK 2000 实战入门</title>
<author>马军</author>
<press>科学出版社</press>
<price dt:dt="number">29.00</price>
<resume >本书从Outlook 2000中文版使用者的角度出发,深入浅出地讲述了如何掌握和使用Outlook 2000中文版的功能和应用。全书内容丰富,解释详尽。书中列举了大量实例、步骤和插图,可供读者对照着学习操作。本书是一本实用性很强的 Outlook 2000的学习指南。
</resume >
</book>
? <book>
<title> Photoshop 高级应用技巧</title>
<author>王炜</author>
<press>科学出版社</press>
<price dt:dt="number">26.00</price>
<price dt:dt="number">29.00</price>
<resume >本书以生动、翔实的实例介绍了应用Photoshop5.0进行高级图像处理的方法,使读者从实例人手,轻松掌握Photoshop5.0的精髓和应用技巧。本书共分十一章,第一章介绍了进行图像处理的基本理论;第二、三、四、五章从典型实例入手,以实际创作的方法向读者展现了Photoshop的关键技术和使用技巧;第六章、第七章利用滤镜对图像进行特殊效果处理;第八章。第十一章综合运用本书的高级技术,创造出几个典型实例,引导读者进入栩栩如生的图像世界。
</resume >
</book>
</bookInformation>
如果在浏览器中打开该文件,浏览器浏览器按照缺省的方式显示,如图9.2所示。

图9.2? 浏览器不验证XML文档的有效性
从图9.2中可以看出浏览器是不验证XML文档的有效性的。因为一本书在一般的情况下不可能同时有两种价格。所以上例虽然是良好的XML文档,但不是有效的XML文档。但是浏览器并没有显示错误信息,所以可以知道浏览器是不验证XML文档的有效性的。正是由于浏览器只进行XML文档结构良好的检查,而不进行有效性验证,所以要求我们自己进行有效性验证,这正是DTD产生的原因。
9.1.2? 什么是DTD
文档类型定义(DTD)是一套关于标记符的语法规则,它告诉可以在文档中使用哪些标记符、它们应该按什么次序出现、哪些标记符可以出现于其他标记符中、哪些标记符有属性等。DTD原来是为使用SGML开发的,它可以是XML文档的一部分,但是它通常是一份单独的文档或者一系列文档。
因为XML本身不是一种语言,而是定义语言的一个系统,它没有像HTML一样拥有一个通用的DTD。相反,想使用XML进行数据交换的工业或组织可以定义它们自己的DTD。
如果一个组织想用XML来标识仅在内部使用的文档,它可以创造自己私有的DTD。比如Wall Street Journal Interactive Edition拥有一个DTD来详细说明每一版,其中有关于页、文章、概要、标题下署名等信息,刊物目前使用SGML DTD(称作Dow Jones Markup Language),但是它也正在开发一个XML版本。
关于DTD并不是没有争议的,一些人感到它给商业业务增加了实实在在的价值,而一些人感觉它限制了创造性,还有一些人认为DTD有用,但是还做得不够。微软正尝试用它的XML数据提议来解决这一不足之处,但是批评者说这些改进应该在DTD规范本身进行。
DTD提供了定义文档规范的一种方法。这是在W3C XML1.0说明书中描述的数据描述方法。下面给出关于DTD相关事实的一些简短的纲要,DTD描述XML文档;DTD可用来检查XML文档的语义有效性和定义ID/IDREF关系;DTD使用尖括号、感叹号、空格符、圆括号、问号和星号来定义哪些元素和属性可以使用以及它们能包含哪些内容;DTD能够为IE 5所支持。
9.1.3? DTD的发展趋势
DTD是SGML中的Schema机制。XML从SGML处继承了这一技术,并加以发展。XML是第一次人们试图改变DTD。DTD的功用很多,包括定义内容模式、限制范围、属性的数据类型,但它也有着缺陷,例如它本身不是用XML书写的,而且它不支持名域。DTD只提供了非常有限的几种数据类型,而且更重要的是它不能表达元素中字符数据的数据类型。DTD有扩展的机制,但这个机制太复杂而且很脆弱。DTD扩展的机制的最大毛病在于不能清楚地表达相互之间的关系,两个有着完全相同内容的元素怎么做也不能互相联系。同样,一组被定义为参数体(parameter entity)的属性(attribute)之间不能建立任何联系。XML的 Schema打破了这些限制,它能更加清晰地表现信息之间的内容,而且像RDF,SVG,XSLT等应用那样,直接使用XML语法,因此它直接继承了许多XML文件的优势,例如方便搜索的特性。XML Schema除了完美支持名域,让XML标注可以通过各名域URI所连接的语汇定义来检测、验证之外,还有许多比DTD更强大的功能,包括数据类型(data types)的定义,对SQL数据库软件提供非常重要的支持。从目前的发展进度来看,XML的Schema代替DTD是不可避免的,但是在短期内DTD 还是有着它的优势的。
(1)广泛的工具支持。所有的SGML和许多XML工具都支持DTD。
(2)广泛的应用。有很多文件形式都支持DTD。
(3)广泛的经验。DTD已经使用多年,在实践中人们已积累了许多宝贵的经验。
9.2? 元素和属性类别宣告
在本节中将介绍如何宣告元素和属性的类别,对XML文档进行有效性验证,以及如何在DTD中添加注释。
9.2.1? 常用量词
在学习元素和属性类别宣告之前,先介绍几个常用量词的含义。在DTD中最常用的量词有“问号”、“星号”、“加号”分别对应的符号是:?、*、+。其中问号(?)代表“可以有0个或一个”,也就是说最多只能代表一个;星号(*)代表任意多个都可以,也就是说可以代表0个到无限多个;加号(+)则表示至少要有一个,但是没有上限,像星号一样,可以有无限多个。
注意:DTD中的“?”、“*”、“,”和“+”都是ASCII(半角)符号,不要误用了中文的全角符号。
9.2.2? 元素类别宣告
下面通过一个具体的实例来介绍如何宣告元素类别。假设有一个XML文档,其源代码如下:
<?xml version="1.0"? encoding="gb2312" ?>
<book>
<title>电子商务基础</title >
<author>唐春林</author>
<press>科学出版社</press>
<price 货币单位="人民币">24.80</price>
<resume>本书介绍电子商务的基础知识及涉及的主要技术,主要偏重于对电子商务的感性认识和参与电子商务的实践(配有相关的上机实践题),并给出了一些电子商务的成功案例。本书既可作为大、中专院校相关课程的参考教材,也可作为政府部门。各机关、企事业单位的"电子商务"培训教材。
</resume>
</book>
? <book>
<title> Photoshop 高级应用技巧</title>
<author>王炜</author>
<press>科学出版社</press>
<price货币单位="人民币">26.00</price>
<resume>本书以生动、翔实的实例介绍了应用Photoshop5.0进行高级图像处理的方法,使读者从实例人手,轻松掌握Photoshop5.0的精髓和应用技巧。本书共分十一章,第一章介绍了进行图像处理的基本理论;第二、三、四、五章从典型实例入手,以实际创作的方法向读者展现了Photoshop的关键技术和使用技巧;第六章、第七章利用滤镜对图像进行特殊效果处理;第八章。第十一章综合运用本书的高级技术,创造出几个典型实例,引导读者进入栩栩如生的图像世界。
</resume >
</book>
我们可以先从文件中的最小的子元素着手,采取“自下而上”的方式来分解这XML文档的结构,XML文档中一共有title,author,press,price和resume五个不含更小的子元素的元素,用DTD中的类别宣告,可以把这五个元素定义为如下所示的代码:
<!ELEMENT title (#PCDATA) >
<!ELEMENT author (#PCDATA) >
<!ELEMENT press (#PCDATA) >
<!ELEMENT price (#PCDATA) >
<!ELEMENT resume (#PCDATA) >
以上的代码在Dreamweaver 4的代码视图窗口中手工直接输入。从上面的代码中可以看出是用<!ELEMENT…>来宣告元素的。ELEMENT之后放的是元素名,然后接着的是它的“内容模型”,由这个内容模型决定在“<元素>***</元素>”之间的***区域可以出现什么样的内容,按照规定,这个内容模型要用小括号括起来。
#PCDATD是XML中预先指定好的标记,全称是“Parsable Character Data”,即“可解析的文字数据”,意思是说里面的文字内容可以让解析器去解析,因此如果内容中由“<”、“'”、“>”、“&”等这些保留给XML语言使用的符号时,要把它们解析成<等,就像在HTML中一样,否则解析器就会“挂”在那里。
以上四个元素的内容模型都很简单,里面只能由单调的文字内容。事实上,XML元素中可以包含混合式的内容(Mixed Content),也就是既可以包含子元素,又可以包含文字内容(即#PCDATA),这种混合内容的抽象模型就很复杂。关于这些内容将在下一章详细介绍。
最小的五个元素宣告以后,往上走一步,开始定义上一层的元素,在这个示例中也就是“book”这个元素。宣告代码如下所示。
<!ELEMENT book ( title, author+,press, price,resume*) >
在这里使用了逗点和量词定义了“book”下属的五个子元素出现的顺序,及其允许的数量,也就是说,作者至少有一人,可以有几人。遵照以上的宣告,当遇到作者不止一个的情形,可以使用如下的代码编写XML文档。
<book>
<title>运筹学基础手册</title >
<author>徐光辉</author>
<author>刘彦佩</author>
<author>程侃</author>
<press>科学出版社</press>
<resume>本书介绍运筹学的基础学科分支,包括线性规划、整数规划、图与网络优化、组合最优化、非线性规划、多目标规划、动态规划、对策论、随机服务系统、可靠性理论、库存论、M。rk。v决策规划、随机规划、决策分析、计算机随机模拟及管理信息系统等。本书介绍不同分支的各章内容基本相对独立,读者可根据需要选读有关章节,无需通读全书.阅读本书只需微积分、高等代数与概率统计的基本知识。
</resume>
</book>
……
可以按照上面的方式来标注第二、三、四个作者。这正是上面的宣告中,在作者后面放一个加号的意义所在。还有请注意,它同时规定了一本书不能没有作者,否则就会像对resume这个子元素的定义一样,用星号而不用加号了。
定义好book这个元素后,还剩下一个元素要定义,那就是最上层的bookInformation。因为bookInformation中可以包含很多本书,也可能一本也没有,所以把它用如下所示的代码定义。
<!ELEMENT bookInformation (book*) >
9.2.3? 属性类别宣告
一些XML元素具有属性。属性包含应用程序使用的信息。属性仅在程序对元素进行读、写操作时,提供元素的额外信息(如ID号等),对于人类读、写元素来说是毫无意义的。例如在上一个实例中,在price一项中,有一个“货币单位”的属性。在DTD中,属性是用<! ATTLIST … >来宣告的。ATT就是属性attribute的简写。LIST是“列表”的意思。整个宣告如下所示:
<!ATTLIST price
货币单位 ( 人民币 | 英镑 | 美元) '人民币'>
最重要的是“货币单位…”这行(称为“属性定义”)共有三个要素。很明显,第一个是属性名,第二个是属性类别,最后是预设值或预设行为的描述。
如果属性不止一个的话,这三个要素单元可以每三个三个这样一直重复下去。在这里用换行和缩排把属性定义突出地显示。其实要把它们统统挤在前面一行也是可行的,只要每个单元之间有一个空白字元隔开就行,但一般不建议这样做。
有很多方法来定义属性。在这里选用的是条列式表示法,把所有可能用到的属性值一一条列出来,而且不能重复。直线记号“|”代表“或”。如果没有列出来的值一律不允许出现在XML文件中。属性值列举完以后,要提供一个预设的值。正因为有预设值,所以在编写XML文档时,可以把“货币单位”这个属性省略掉。请参看如下所示的代码:
<book>
<title>电子商务基础</title >
<author>唐春林</author>
<press>科学出版社</press>
<price>24.80</price>
<resume>本书介绍电子商务的基础知识及涉及的主要技术,主要偏重于对电子商务的感性认识和参与电子商务的实践(配有相关的上机实践题),并给出了一些电子商务的成功案例。本书既可作为大、中专院校相关课程的参考教材,也可作为政府部门。各机关、企事业单位的"电子商务"培训教材。
</resume>
</book>
? <book>
<title> Photoshop 高级应用技巧</title>
<author>王炜</author>
<press>科学出版社</press>
<price>26.00</price>
<resume >本书以生动、翔实的实例介绍了应用Photoshop5.0进行高级图像处理的方法,使读者从实例人手,轻松掌握Photoshop5.0的精髓和应用技巧。本书共分十一章,第一章介绍了进行图像处理的基本理论;第二、三、四、五章从典型实例入手,以实际创作的方法向读者展现了Photoshop的关键技术和使用技巧;第六章、第七章利用滤镜对图像进行特殊效果处理;第八章。第十一章综合运用本书的高级技术,创造出几个典型实例,引导读者进入栩栩如生的图像世界。
</resume >
</book>
处理XML数据的程序会自动把它们看成为如下所示的代码:
<book>
<title>电子商务基础</title >
<author>唐春林</author>
<press>科学出版社</press>
<price 货币单位="人民币">24.80</price>
<resume>本书介绍电子商务的基础知识及涉及的主要技术,主要偏重于对电子商务的感性认识和参与电子商务的实践(配有相关的上机实践题),并给出了一些电子商务的成功案例。本书既可作为大、中专院校相关课程的参考教材,也可作为政府部门。各机关、企事业单位的"电子商务"培训教材。
</resume>
</book>
? <book>
<title> Photoshop 高级应用技巧</title>
<author>王炜</author>
<press>科学出版社</press>
<price货币单位="人民币">26.00</price>
<resume >本书以生动、翔实的实例介绍了应用Photoshop5.0进行高级图像处理的方法,使读者从实例人手,轻松掌握Photoshop5.0的精髓和应用技巧。本书共分十一章,第一章介绍了进行图像处理的基本理论;第二、三、四、五章从典型实例入手,以实际创作的方法向读者展现了Photoshop的关键技术和使用技巧;第六章、第七章利用滤镜对图像进行特殊效果处理;第八章。第十一章综合运用本书的高级技术,创造出几个典型实例,引导读者进入栩栩如生的图像世界。
</resume >
</book>
然后将元素和属性类别的宣告放在一起,在前面加上XML宣告。最终此DTD文档的代码如下所示。
<?xml version="1.0" encoding="gb2312" ?>
<!ELEMENT book ( title, author+,press, price+,resume*) >
<!ELEMENT bookInformation (book*) >
<!ELEMENT title (#PCDATA) >
<!ELEMENT author (#PCDATA) >
<!ELEMENT press (#PCDATA) >
<!ELEMENT price (#PCDATA) >
<!ELEMENT resume (#PCDATA) >
<!ATTLIST price
货币单位 ( 人民币 | 英镑 | 美元) '人民币'>
在这里有两个方面值得大家注意。
第一,由于在编写含中文元素和属性时,常常需要在中文和英文之间切换,这时必须保证不要将ASCII符号误用了中文的全角符号。
如图9.3所示,就告诉我们在内容模型中使用了非法的字符,这时就应该检查是否在应该使用英文符号的地方使用了中文符号。

图9.3? 在内容模型中使用了非法字符
[下一页]
|