1、第三章 文档类型定义,本章学习目标,理解有效XML文档的概念 理解DTD的概念和用途 掌握DTD对元素的声明方式 掌握DTD对属性的声明方式,课程引入:,XML文档不仅要保证Well-formed,还须要保证Valid。 如何保证XML文档Valid?由DTD或 XML Schema来保证 DTD出现时间较早,在SGML中就起作用 XML Schema出现较晚,符合XML文档规范,3.1 定义XML文档结构的意义,1、便于交流2、便于验证DTD和XML Schema是为解决以上问题而制定的。一个有效的XML文档既要遵守XML的语法规则,也要遵守在DTD或XML Schema中定义的规则。,XM
2、L模式,XML模式是描述XML文档结构的机制。DTD和XML Schema是两种XML建模工具,它们的作用类似于数据库模式定义语言,利用它们可以为一类XML文档建立一个模式。一个模式描述了一类文档的结构,规范了该类文档中标记和文本可能的组合形式。,3.2 DTD语法,文档类型定义DTD (Document Type Definition)提供了定义文档规范的一种方法。DTD定义XML文档的基本结构,定义在XML文档中出现的元素、这些元素出现的次序、元素之间的关系、元素可以使用的属性、文档可以使用的实体以及XML文档结构的其他详细信息。DTD实际上定义了一个语法分析器。,3.2.1 DTD声明,
3、DTD定义了置标语言、文档结构的语法和词汇表。 DTD声明方法为:其中“定义的内容”是用标签定义,它包括: 元素类型声明; 元素属性声明; 实体声明; 标记声明。,3.2.2 内部和外部DTD,内部DTD文件表示DTD直接写在XML文档中,其所定义的限制就只能应用于此XML文档; 外部DTD文件是作为一个外部文件被XML文档引用,其优点是一个DTD外部文件可以被多个XML文档共享.,1.内部文档类型定义(Internal DTD) 基本表达形式:2.外部文档类型定义 (External DTD) 一般形式: ,3.公用DTD有一种外部DTD,是由权威机构制定的,提供给特定行业或公众使用的DTD
4、。引用公用DTD的形式是: ,DTD-name只能包含字母、数字、空格和以下符号:_%$#()+:=/!*;?。 同时,DTD名称还必须符合一些标准的规定。例如,ISO标准的DTD以“ISO”三个字母开头;被改进的非ISO 标准的DTD以加号“+”开头;未被改进的非ISO标准的DTD以减号“-”开头。 无论是哪一种情况,开始部分后面都跟着两个斜杠“/”及DTD所有者的名称。在这个名称之后又是两个斜杠“/”,再然后是DTD所描述的文件的类型。最后,在又一对斜杠之后是语言的种类。 例: ,内部DTD文件示例,张祥100008000150006000刘娴,内部DTD文档放在XML声明之后 或在处理指
5、令后,但在数据之前,外部DTD文件应用示例,外部DTD文件,XML中应用外部DTD方法张祥100008000150006000 ,DTD文件应用效果,表明DTD文件对XML文档起作用,使该文档不仅形式良好,而且有效.,3.2.3 定义元素,元素是XML文档的核心。元素类型声明的一般格式是:元素内容可以分为以下5种类型:字符或文本数据 #PCDATA空 EMPTY元素列表 只包含子元素,不包含文本混合 元素和字符数据或文本的组合任意 ANY,#PCDATA在元素的类型声明中,如果声明的数据类型是#PCDATA,则表示该元素的内容是可解析的字符数据,不能在元素中包含子元素。EMPTY(空元素)不包
6、含任何字符数据,也不包含子元素,子元素声明这一类声明表示一个元素只能包含子元素,它规定了一个元素可以包含多少个子元素,每个子元素出现的相对顺序,每个子元素出现的次数以及子元素又是如何嵌套自己的子元素的。1.如果要求一个元素的子元素在文档中出现的顺序必须与DTD定义的顺序一致,则按下列定义方式:2.如果允许一个元素的各个子元素以任意顺序出现,甚至有的不出现,可采用下列方法定义:或 ,ANY对一个元素指定为ANY内容,则该元素的结构是可以任意指定的,它可以包含任意多个子元素和字符数据,这个元素完全没有结构限制。ANY适用于程序调试、检查。混合内容如果一个元素既要包含#PCDATA数据又要包含子元素
7、,那么这个元素的内容就是一种混合内容。,DTD的元素定义符号及其含义,3.2.4 定义属性,元素属性声明同样是为了保持文档的合法性。 元素通常具有多个属性; 在DTD中用下列格式标记元素属性:属性声明在文档中顺序并无严格要求。,属性类型,属性附加声明,属性附加声明有四种: #REQUIRED:表示该属性是必需的,不能没有 #IMPLIED:表示属性是可加可不加的情况 #FIXED+固定值:表示在XML文档中只会给出一个元素所定义的固定值 默认值:属性默认值紧跟在属性类型之后,属性类型详解 1.CDATA CDATA指的是纯文本,代表已编译的字符数据。 CDATA属性类型是限制最少、最自由的属性
8、类型。 属性中如果出现“代替“”。, 我可不这么认为! 为什么呢? ,2.NMTOKEN和NMTOKENS类型 NMTOKEN类型属性值是一个XML名称记号。 XML名称记号只能包含数字、字母、下划线、冒号及其他名字字符,可以由数字开头。 NMTOKEN是CDATA的一个子集。 NMTOKENS是由空格分隔的若干个NMTOKEN类型属性列表。,八阵图功盖三分国,名成八阵图,江流石不转,遗恨失吞吴.,八阵图功盖三分国,名成八阵图,江流石不转,遗恨失吞吴.,八阵图功盖三分国,名成八阵图,江流石不转,遗恨失吞吴.,八阵图功盖三分国,名成八阵图,江流石不转,遗恨失吞吴.,3.ID类型,ID是用属性值的
9、方式为文件中的某个元素定义唯一标识的方法 ID的值必须是一个有效的XML名称,XML名称与XML名称记号类似,但XML名称的第一个字符必须是字母或下划线。每个XML名称都是一个XML名称记号,然而XML名称记号不全是XML名称。 一个元素只能有一个ID类型的属性,而且ID属性的取值必须与XML文档中其他元素的ID类型属性的取值不同。 此类属性经常使用REQUIRED缺省类型;而不要指定缺省值或使用FIXED型、IMPLIED型。, 张三 李四 libbb.org ,不是有效的XML名称,4. IDREF、IDREFS类型,IDREF类型允许一个元素引用文件中的另一个元素,方法就是把那个元素的
10、ID标识值作为当前元素IDREF类属性的取值。 IDREF属性取值必须与当前XML文档中某个元素的ID属性的取值相同。 如果在DTD中使用了IDREF属性类型,则有效性验证解析器会确定IDREF引用的每个ID属性是否都在XML文档中。, 张三 李四 ,IDREFS同IDREF,是可以具有由空格分开的多个引用。,空格,5.Enumerated枚举类型,属性也可以被描述为一组可接受的取值的列表,XML文件中对属性的赋值将从这个列表中选取一个值。 各选择值通过竖线“|”分隔; 关键字ENUMERATED是不出现在DTD定义中的。, ,属性的默认取值为“鸡肉”。,不需要引号,6. NOTATION
11、,XML通过NOTATION声明为非XML格式数据描述一种可能的处理方式。能够让XML应用程序知道如何处理非XML格式数据。 NOTATION属性值是等于一个注记名。因此要使用NOTATION类型属性,首先要在DTD中为可选用的注记作出声明。注记声明的方式有两种 :或者:例如:说明注记gif的类型为image/gif。,NOTATION,NOTATION类型允许属性值为一个DTD中声明的NOTATION 注记; 这个类型对于使用非XML格式的数据非常有用。 现实世界中存在着很多无法或不易用XML格式组织的数据,例如图象、声音、影象等等。对于这些数据,XML应用程序常常并不提供直接的应用支持。通
12、过为它们设定NOTATION类型的属性,可以向应用程序指定一个外部的处理程序。例如,当你想要为一个给定的文件类型指定一个演示设备时,可以用NOTATION类型的属性作为触发。,MIME多功能Internet邮件扩充服务,是一种多用途网际邮件扩充协议。服务器将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型。,在下面这个例子中,为“电影“元素指定了两种可选设备:一种是movPlayer.exe,用来播映.mov文件,另一种则用来绘制GIF图象。 ,属性缺省值,1,#REQUIRED 元素的所有实例都必须有该属性的值(NOT NULL) 语法:DTD 示例: XM
13、L 示例: ,2, IMPLIED 属性值可有可无的属性,元素的实例中可以忽略该属性(NULL)。 语法:DTD示例:XML示例:,3,元素实例中该属性的值必须为指定的固定值。(常量) 语法:DTD示例:XML示例:,4,Default value(可覆盖) 为属性提供一个默认的值 语法:DTD示例:XML示例:,信息工程计算机应用李华男倪冰,3.5 实体的声明与引用,3.5.1 实体的概念与分类实体可以指代其他复杂的结构,包括形式规范的XML、其他形式的文本或二进制数据。 用实体替代XML文字区块 用实体指代外部的独立的文件 用外部实体引用二进制数据 实体的分类: 预定义实体(内嵌替代符)
14、一般实体 参数实体,3.5.2 一般实体(普通实体),实体可以指代其他复杂的结构,包括形式规范的XML、其他形式的文本或二进制数据。 一般实体 内部实体:将实体所指代的内容已经包含在DTD文件本身中。 外部实体:所实体所指代的内容独立于XML文档。XML能过URL定位来引入外部实体; 解释实体:一定会被XML解析器所解释并使用的实体。 非解释实体:可能被XML解析器忽略的实体。 其中,非解释实体一定是外部实体,故实体可分为三类: 内部解释实体(内部实体) 外部解释实体 外部非解释实体,1.内部解释实体(内部普通实体),实体声明的语法为:实体的使用语法:内部解释实体可以在内部DTD中声明: ,李
15、华,内部解释实体也可以在外部DTD子集中声明。使用外部子集定义内部解释实体,2.外部解释实体(外部普通实体),XML文档中引用一个完整的文件,则需要外部解释实体 外部解释实体声明的语法格式:或者例:而在XML文档中引用实体,使用,被引用的外部实体,李华,倪冰,3.18.xml,3.19.xml,返回一般实体,3.外部非解释实体,外部非解释实体用来在XML程序文档中加入二进制数据,例如,图像、声音等多媒体数据。 定义外部非解释实体的语法:NDATA表示XML不解析该数据 引用方式:作为ENTITY/ENTITIES类型属性的属性值的赋给属性; ,ENTITY、ENTITIES,ENTITY类型的
16、属性的取值必须是当前XML文档中的某个外部非解释实体(ENTITY)的名字。拥有ENTITY类型的属性的元素利用这种属性来引用外部实体。 ENTITIES类型的属性与ENTITY类型的属性相似,只不过ENTITIES类型的属性可以包含多个外部实体名,其间用空格分隔。,两种外部实体的比较,外部解释实体的声明引用方法: 外部非解释实体的声明引用方法:属性名=“ABC”, ,实体名用在属性值中, ,3.5.3 参数实体,所谓参数实体的概念就是说该实体实际上不是在具体实例文档中使用,而是在DTD文档内部被使用。参数实体专门用在DTD中。 1.内部参数实体的定义语法是:外部参数实体的定义语法是:引用方式
17、为:%参数实体名; 使用参数实体,可以方便编写DTD,有利于维护DTD文件。,&一般实体名;,有空格,无空格,例:,注意:参数实体指代的内容不是完整的DTD声明,只能用 于外部DTD,2.外部参数实体,Public.dtd%book;book1.dtd,3.条件语句,在复用已经存在的DTD时,如果需要作简单的修改,可以使用INCLUDE和IGNORE标记。 通过使用INCLUDE和IGNORE,可以方便地改变原有的缺省值甚至小范围地改动DTD所定义的XML文档结构。方法:在复用DTD基础上需要特别加入的部分括入:INCLUDE,需要特别去除的部分括入IGNORE即可。,条件语句,使用INCLU
18、DE标记的语法格式为:使用IGNORE标记的语法格式为: ,条件语句,例如: 指示解析器包括myElement1的声明; 指示解析器忽略myElement2的声明;,必须是完整的用尖括号括起来的声明,条件语句通常与参数实体一起使用,示例:%unit; 14, ,3.24.dtd,返回到目标,小结,DTD包括 元素的声明属性的声明实体的声明 预定义实体 内部解释实体一般实体 外部解释实体参数实体 外部非解释实体 条件语句 INCLUDEIGNORE通过综合实例我们知道,HTML文档通过脚本调用XML文档中的数据,并输出显示。,使用DTD文件存在的问题,DTD使用了一个属于自己的语法,很明显地与X
19、ML的标记语法不同。 DTD对于数据类型的支持过少,DTD根本不支持数据类型的限制,只能定义#PCDATA,这是明显不足的。 DTD所支持的结构定义灵活性过低 DTD不支持名称空间,综合实例,最后,我们来总结一些前三章学习的内容,写一个包含DTD,XML,以及Script的简单实例,便于同学们理解:1.将下面文件存为myfile.dtd ,综合实例,2.然后建立XML文档myfile.xml: XML轻松学习手册 xml ,综合实例,3.建立HTML文档myfile.html var xmlDoc = new ActiveXObject(“Microsoft.XMLDOM“); xmlDoc.load(“myfile.xml“); nodes = xmlDoc.documentElement.childNodes; title.innerText = nodes.item(0).text; author.innerText = nodes.item(1).text; ,综合实例,在HTML中调用XML数据 标题: 作者: 4.用IE5.0以上浏览器打开myfile.html就可以看到效果了。,