第3章有效的XML文档与DTD
合集下载
第三章 有效的XML文件

具有独自语法结构的文件
XMLSchema模式 模式
是一个特殊的XML文件 文件, 是一个特殊的 文件 比DTD更复杂 更复杂
简单 早于XMLSchema 早于
晚
XML基础教程 基础教程
什么是有效的XML 什么是有效的XML文件 XML文件
什么是有效的XML文件 文件? 什么是有效的 文件
– 一个规范的 一个规范的 规范的XML文件如果和某个 文件如果和某个DTD文件相 文件如果和某个 文件相 关联,并遵守该DTD文件规定的限制条件就 关联,并遵守该DTD文件规定的限制条件就 称为有效的 有效的XML文件。 文件。 称为有效的 文件
规定标记的子标记 限制标记只有文本数据 规定标记的混合内容 EMPTY和ANY 和
XML基础教程 基础教程
ELEMENT作用 ELEMENT作用 –
约束的内容
规定标记的子标记
– 规定有那些子标记 – 子标记是否允许重复出现 – 子标记出现的顺序
这些约束内容出现在DTD中元素声明的“标记 中元素声明的“ 这些约束内容出现在 中元素声明的 的约束条件”部分。格式如下: 的约束条件”部分。格式如下:
DOM解析器 解析器
– 检查 检查XML文件的规范 文件的规范,DTD文件的语法 文件的语法, 文件的规范 文件的语法 – XML文件的引用 文件的引用,XML文件或 文件或DTD文件不存 文件的引用 文件或 文件不存 在等. 在等
XML基础教程 基础教程
DTD – DTD中的元素 DTD中的元素
XML基础教程 基础教程
<T226次 <T226次> <开车时间> 开车时间> <hour>08点 <hour>08点</hour> <minute>45分 <minute>45分</minute> </开车时间> </开车时间> 开车时间 终到时间> <终到时间> <hour>19点 <hour>19点</hour> <minute>36分 <minute>36分</minute> </终到时间 终到时间> </终到时间> </T226次> </T226次 </列车时刻表 列车时刻表> </列车时刻表>
XMLSchema模式 模式
是一个特殊的XML文件 文件, 是一个特殊的 文件 比DTD更复杂 更复杂
简单 早于XMLSchema 早于
晚
XML基础教程 基础教程
什么是有效的XML 什么是有效的XML文件 XML文件
什么是有效的XML文件 文件? 什么是有效的 文件
– 一个规范的 一个规范的 规范的XML文件如果和某个 文件如果和某个DTD文件相 文件如果和某个 文件相 关联,并遵守该DTD文件规定的限制条件就 关联,并遵守该DTD文件规定的限制条件就 称为有效的 有效的XML文件。 文件。 称为有效的 文件
规定标记的子标记 限制标记只有文本数据 规定标记的混合内容 EMPTY和ANY 和
XML基础教程 基础教程
ELEMENT作用 ELEMENT作用 –
约束的内容
规定标记的子标记
– 规定有那些子标记 – 子标记是否允许重复出现 – 子标记出现的顺序
这些约束内容出现在DTD中元素声明的“标记 中元素声明的“ 这些约束内容出现在 中元素声明的 的约束条件”部分。格式如下: 的约束条件”部分。格式如下:
DOM解析器 解析器
– 检查 检查XML文件的规范 文件的规范,DTD文件的语法 文件的语法, 文件的规范 文件的语法 – XML文件的引用 文件的引用,XML文件或 文件或DTD文件不存 文件的引用 文件或 文件不存 在等. 在等
XML基础教程 基础教程
DTD – DTD中的元素 DTD中的元素
XML基础教程 基础教程
<T226次 <T226次> <开车时间> 开车时间> <hour>08点 <hour>08点</hour> <minute>45分 <minute>45分</minute> </开车时间> </开车时间> 开车时间 终到时间> <终到时间> <hour>19点 <hour>19点</hour> <minute>36分 <minute>36分</minute> </终到时间 终到时间> </终到时间> </T226次> </T226次 </列车时刻表 列车时刻表> </列车时刻表>
第3章 文档类型定义(DTD)

3.6 小结
本章主要学习了DTD的基本概念和语法,包括在XML 中声明DTD的方式,使用DTD声明元素、属性列表和实体等 的方式。如何使用DTD来描述和约束文档结构是本章的主旨 。另外,本章还粗略地讲述了XML Schema开发和XML命 名空间的基础知识。
3.3 实体和外部DTD子集
实体(ENTITY)是一种替代物,用于内容转义,在 XML文档中可以直接用实体名来代替实体值使用。实体可以 定义在文档的前序部分,也可以定义在DTD中。 内部实体完全在文档有效空间内部定义,内部实体的 值在DTD文档内部或DOCTYPE声明中声明;外部实体是在 XML文档外部定义的实体,实体的值在外部资源中声明。 已解析实体的值经过XML解析器解析,成为XML或 DTD的一部分,如字符、数字和文本对象等;未解析实体的 值未经XML解析器解析,可以是二进制数据,如图片、声音 等。
3.5.3 命名空间的使用
声明了命名空间,有了命名空间下的合法名称,就可 以使用命名空间来区别具有相同名称的元素和属性了。命名 空间的使用方法是在属于该名称空间的元素或属性名称前添 加前缀和冒号“:”,表示其所属的名称空间。
3.5.4 DTD与命名空间
在命名空间声明中,命名空间名其目的在于标识特定 的命名空间。XML解析器遇到一个命名空间声明后,就把等 号左边的命名空间前缀和右边的命名空间名绑定在一起,对 于后面使用了该前缀的合法名称,都可以归属于同一个命名 空间中。根据DTD进行有效性检测时,也并不是把这个命名 空间映射到URI所指的DTD文件,而是去找所有在 DOCTYPE中声明的内部和外部的DTD,看其所定义的哪一 个元素或属性名与文档中用到的元素或属性名相同。
3.1.7 在文档间共享通用的DTD
为方便多个文档共享同一个DTD,可以将DTD单独定 义在一个文件中。XML文档只要添加对DTD文件的引用就 可以起到文档内DTD的作用了。这样,多个XML文档就可 共享同一个DTD文件了。
xml 《DTD》模式简介

DTD 的局限性
由于 DTD 本身并不是专门面向 XML 的数据 模式语言,所以在对 XML 数据进行建模时, 也存在一定的局限性。
DTD 没 有 采 用 XML 的 语 法 形 式 (examples/xslt2/book.dtd)。 DTD 并不能完全满足 XML 自动化处理的要求,例 如不支持 XML 中的命名空间、不能很好实现应用 程序不同模块间的相互协调,缺乏对文档结构、属 性、数据类型等约束的足够描述能力等等。
不受限制的词汇表:可以随意地使用任何元 素、属性名称。 没有任何语法规则:每个元素中都可以包含 任意的内容(混合内容、子元素、文本、或 者为空)。 对于属性没有任何限制:每个元素都可以包 含任意的属性。
数据模式的用途 2
XML 树型模型的表达能力更强,对于相同的 数据可能采取各种不同的表示方式,为信息的 交换和处理带来极大的困难。 需要通过某种方式,定义 XML 数据的词汇表 (可能是针对某个领域),包括元素和属性的 名称、甚至取值,并且需要通过语法规则控制 XML 元素的结构,而实现这项任务的过程, 通常将其称为“XML 文档的数据模式设计”。
(4). 只包含子元素的元素
要声明一个只包含子元素的元素,其语法为:
<!ELEMENT element-name (child1,child2,...)>
其中,(child1,child2,...) 表示一个序列,即内 容模型。 <!ELEMENT student (stu_name, stu_no, stu_bak)> 。这项声明表示 student 元素中必 须包含 stu_name、stu_no、stu_bak 三个子 元素,并且它们的次序不能颠倒。
第3章 DTD规范XML文档(1)

8/36
3.1 DTD的基本概念(7/13)
DTD的基本结构(4/4)
文档类型声明-例2
第3章
DTD规范XML文档
文档类型声明
<?xml version="1.0“ standlone=“no”?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
两种外部DTD:私有的外部DTD、公有的外部DTD
12/36
3.1 DTD的基本概念(11/13)
外部DTD(2/4)
第3章
DTD规范XML文档
如果需要在XML文档中使用外部DTD,则必须在X ML文档的文档类型定义部分通过URL引用外部DTD (1)私有的外部DTD 语法格式: <!DOCTYPE
外部DTD:note.dtd
引用外部DTD(私有)
注意
为了让DTD能支持特定字符,应该为外部DTD文 档指定编码方式
14/36
3.1 DTD的基本概念(13/13)
外部DTD(4/4)
(2)公有的外部DTD 语法格式:
第3章
DTD规范XML文档
<!DOCTYPE 根元素名 PUBLIC "DTD-NAME" "DTD-URL">
17/36
3.1 DTD的基本概念(7/13)
DTD的基本结构(4/4)
文档类型声明-例2
第3章
DTD规范XML文档
文档类型声明
<?xml version="1.0“ standlone=“no”?> <!DOCTYPE note SYSTEM "note.dtd"> <note> <to>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
两种外部DTD:私有的外部DTD、公有的外部DTD
12/36
3.1 DTD的基本概念(11/13)
外部DTD(2/4)
第3章
DTD规范XML文档
如果需要在XML文档中使用外部DTD,则必须在X ML文档的文档类型定义部分通过URL引用外部DTD (1)私有的外部DTD 语法格式: <!DOCTYPE
外部DTD:note.dtd
引用外部DTD(私有)
注意
为了让DTD能支持特定字符,应该为外部DTD文 档指定编码方式
14/36
3.1 DTD的基本概念(13/13)
外部DTD(4/4)
(2)公有的外部DTD 语法格式:
第3章
DTD规范XML文档
<!DOCTYPE 根元素名 PUBLIC "DTD-NAME" "DTD-URL">
17/36
使用DTD规范XML文档

例:<!ELEMENT TITLE(#PCDATA)>
Page 11
3.2.2 各种元素的声明
1.基本字符元素的声明 2.含子元素的严格声明 3.包含任意内容的声明 4.子元素出现次数的声明 5.选择性子元素的声明 6.空元素的声明 7.混合型元素的声明 8.实体的声明
Page 12
1.基本字符元素的声明
Page 16
5.选择性子元素的声明
语法:<!ELEMENT 元素名称 使用规则> 语法:<!ELEMENT 元素名称 (子元素)> (子元素):指示元素中包含的子元素 1如果子元素用“|”分开,说明任选其一。
Page 17
6.空元素的声明
语法:<!ELEMENT 元素名称 使用规则> EMPTY:指示元素的不能有主体内容。 <!ELEMENT 元素名称 EMPTY >
语法:<!ELEMENT 元素名称 使用规则> <!ELEMENT 元素名称 (#PCDATA) > 指示元素的主体内容只能是普通的文 本.(Parsed Character Data)
Page 13
2.含子元素的严格声明
语法:<!ELEMENT 元素名称 使用规则> <!ELEMENT 元素名称 (子元素)> (子元素):指示元素中包含的子元素 如果子元素用逗号分开,说明必须按照声明 顺序去编写XML文档 <!ELEMENT 元素名称 (子元素1,子元素2,子 元素3,…)>
Page 19
要宣告混合内容的元素型态,你可以使用下列两 种内容模型格式的任何一种: 1 只有字符数据 。要宣告只包含字符数据的元 素型态,使用内容模型(#PCDATA)。例如, 下面的宣告让SUBTITLE 元素只能包含字符数据: <!ELEMENT SUBTITLE (#PCDATA)> 根据这个宣告,下面两个元素都是有效的: <SUBTITLE>A New Approach</SUBTITLE> <SUBTITLE></SUBTITLE>
Page 11
3.2.2 各种元素的声明
1.基本字符元素的声明 2.含子元素的严格声明 3.包含任意内容的声明 4.子元素出现次数的声明 5.选择性子元素的声明 6.空元素的声明 7.混合型元素的声明 8.实体的声明
Page 12
1.基本字符元素的声明
Page 16
5.选择性子元素的声明
语法:<!ELEMENT 元素名称 使用规则> 语法:<!ELEMENT 元素名称 (子元素)> (子元素):指示元素中包含的子元素 1如果子元素用“|”分开,说明任选其一。
Page 17
6.空元素的声明
语法:<!ELEMENT 元素名称 使用规则> EMPTY:指示元素的不能有主体内容。 <!ELEMENT 元素名称 EMPTY >
语法:<!ELEMENT 元素名称 使用规则> <!ELEMENT 元素名称 (#PCDATA) > 指示元素的主体内容只能是普通的文 本.(Parsed Character Data)
Page 13
2.含子元素的严格声明
语法:<!ELEMENT 元素名称 使用规则> <!ELEMENT 元素名称 (子元素)> (子元素):指示元素中包含的子元素 如果子元素用逗号分开,说明必须按照声明 顺序去编写XML文档 <!ELEMENT 元素名称 (子元素1,子元素2,子 元素3,…)>
Page 19
要宣告混合内容的元素型态,你可以使用下列两 种内容模型格式的任何一种: 1 只有字符数据 。要宣告只包含字符数据的元 素型态,使用内容模型(#PCDATA)。例如, 下面的宣告让SUBTITLE 元素只能包含字符数据: <!ELEMENT SUBTITLE (#PCDATA)> 根据这个宣告,下面两个元素都是有效的: <SUBTITLE>A New Approach</SUBTITLE> <SUBTITLE></SUBTITLE>
DTD

声明属性时应注意以下几点: (1)属性名称遵循的规则与有效的元素名称相 同。 (2)在一个给定的元素中不能有两个属性同名。 (3)若属性值中含有双引号,则该属性值应用 单引号扩起来。
表3-3
如例
表3-4
属性的类型 ⑴ CDATA属性类型:此种类型的属 性值只能是文本字符串,用CDATA关键字 进行声明。 实例3-2 P59
⑹ <!ELEMENT year (#PCDATA)>
<!ATTLIST year format (numeric | character) #FIXED “numeric”>
⑺ <!ELEMENT year (#PCDATA)>
<!ATTLIST year format (numeric | character) #REQUIRED>
<!DOCTYPE Directory SYSTEM "test.dtd">
内部DTD
P47 外部DTDຫໍສະໝຸດ P483.3 DTD语法元素声明 <!ELEMENT name content> name是元素的名称 content指明元素内容的情况,可能出 现关键词EMPTY、关键词ANY或描述包含 在本元素中的子元素的顺序和重复次数的 内容模型。
(5)混合类型:既包含子元素又包含字符数 据的元素。 混合内容元素的声明采用特定的格式, 以#PCDATA开始,后面是混合内容中可能 出现的子元素类型,每种只需声明一次, 在右括号之后有一个“*”。
<!ELEMENT pick (#PCDATA | one | two | three)*>
再回顾一下前面的例子
⑻ <!ELEMENT year (#PCDATA)> <!ATTLIST year format (numeric | character) #IMPLIED>
表3-3
如例
表3-4
属性的类型 ⑴ CDATA属性类型:此种类型的属 性值只能是文本字符串,用CDATA关键字 进行声明。 实例3-2 P59
⑹ <!ELEMENT year (#PCDATA)>
<!ATTLIST year format (numeric | character) #FIXED “numeric”>
⑺ <!ELEMENT year (#PCDATA)>
<!ATTLIST year format (numeric | character) #REQUIRED>
<!DOCTYPE Directory SYSTEM "test.dtd">
内部DTD
P47 外部DTDຫໍສະໝຸດ P483.3 DTD语法元素声明 <!ELEMENT name content> name是元素的名称 content指明元素内容的情况,可能出 现关键词EMPTY、关键词ANY或描述包含 在本元素中的子元素的顺序和重复次数的 内容模型。
(5)混合类型:既包含子元素又包含字符数 据的元素。 混合内容元素的声明采用特定的格式, 以#PCDATA开始,后面是混合内容中可能 出现的子元素类型,每种只需声明一次, 在右括号之后有一个“*”。
<!ELEMENT pick (#PCDATA | one | two | three)*>
再回顾一下前面的例子
⑻ <!ELEMENT year (#PCDATA)> <!ATTLIST year format (numeric | character) #IMPLIED>
第3章在XML文档中使用DTD解读
• 2. Enumerated型
– 如果属性值并不是任意的字符串,而是在 几个可能的值中进行选择,如书籍的“类 别”属性,其值可为“文艺”,也可为 “自然科学”,而不可能为其他情况时, 则可以将书籍的“类别”属性设定为 Enumerated型。
3. ID型 • 当元素的某个属性值是不能重复时,如 书籍的ISBN属性、个人的“身份证号”属 性等,要定义这样的属性则需使用属性的ID 类型。在一个XML文档中,所有元素的ID类 型属性的属性值必须是唯一的,不可重复, 另外,一个元素不能有超过一个ID类型的属 性。
不限定元素内容的声明
• ANY是DTD中使用很频繁的一个关键字, 特别是对于文档根元素的声明。在定义一个 DTD文档时通常很难准确地确定一个元素是 否具有子元素的情况,此时一般的做法是指 定该元素的子元素为ANY型,这样在它之中 可以包含任何数据、任何声明的子元素及其 数据和子元素的组合。 •
ANY元素lt;!DOCTYPE 根元素名称 [定义的内容]> – 其中“[定义的内容]”是用标签<!ELEMENT>定 义,它包括:
• • • • 元素类型声明; 元素属性声明; 实体声明; 记法声明。
3.1 DTD概述
• 内部DTD文件示例
<?xml version="1.0" encoding="gb2312" standalone="yes"?> <!DOCTYPE 持股信息 [ <!ELEMENT 持股信息 (股东)*> <!ELEMENT 股东 (姓名, 武商股份, 神龙电业, 浦发银行, 兴和基金)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT 武商股份 (#PCDATA)> <!ELEMENT 神龙电业 (#PCDATA)> <!ELEMENT 浦发银行 (#PCDATA)> <!ELEMENT 兴和基金 (#PCDATA)> ]>
第3章_DTD文档类型定义
2 定义元素及其后代(4)
复合型元素的声明,即定义元素及其子元素: DTD尽管要求严格,但也有它的灵活性。使用正则表达式,我们就 可以描述父元素与子元素之间非常复杂的关系。下面就是描述子 元素的正则式:
元 字 符 + * ? 含 义 出现一次或多次 出现零次或多次 不出现或出现一次
()
| ,
一组要共同匹配的表达式
2 定义元素及其后代(6)
重复元素 DTD定义(+:至少出现一次) <!ELEMENT 联系人 (姓名,EMAIL+)> <!ELEMENT 姓名 (#PCDATA)> <!ELEMENT EMAIL (#PCDATA)> 下面的XML片断是有效的: <联系人> <姓名>张三</姓名> <EMAIL>zhang@</EMAIL> <EMAIL>zhang@</EMAIL> <EMAIL>zhang@</EMAIL> </联系人> 而下面这个XML片断不是有效的: <联系人> <姓名>张三</姓名> </联系人>
2 定义元素及其后代(1)
元素的声明: 元素声明不但说明了每个XML文件中可能存在的元素,给出了元 素的名字,而且给出了元素的具体类型。一个XML元素可以为空, 也可以是一段纯文本,还可以有若干个子元素,而这些子元素同时 又可以有它们的子元素。DTD正是通过元素之间的父子关系,描 述了整个文件的结构关系。 元素的声明形式为: <!ELEMENT 元素名 元素内容描述> 元素内容可分为如下的3个类型: 简单型:元素内容是可解析的字符数据(Parsed Character Data, PCDATA),即不含有子元素的文本。 复合型:元素的内容含有其它元素,既有子元素。 混合型:元素的内容既有文本数据又有子元素。
第3章 有效的XML文件—DTD
语法格式如下: <!ELEMENT 元素名称 (#PCDATA)> 【例3-6】声明简单元素
<!ELEMENT bookname(#PCDATA)> 上述bookname可以是空元素也可以包含数据内容,但是一定不能 包含子元素。如果在XML文档中定义子元素,则是非法的,例如:
<bookname> <author>张三</author> <name>XML教程</name>
DTD定义了置标语言、文档结构的语法和词汇表,实际
上是定义了一个语法分析器。
XML基础教程
第3章 有效的XML文件-DTD
第6页
DTD的分类
外 部 DTD 可 以 单 独 形 成 文 件 , 后 缀 名 为.dtd,该文件可以被多个XML文档共享和 DTD调用。 内部DTD是在XML文档中直接定义DTD, 该DTD只能被当前XML文档使用。
XML基础教程
第3章 有效的XML文件-DTD
第12页
DTD基本结构模板
DTD的基本结构包括XML声明、元素声明、属性声明、
实体声明等,DTD基本结构模板如下所示:
<!ELEMENT …> <!ELEMENT …> … <!ATTLIST …> <!ATTLIST …> … <!ENTITY…> … <!NOTATION…> XML基础教程...
XML基础教程
第3章 有效的XML文件-DTD
第17页
Unrestricted元素
Unrestricted 元素表示在XML文档中可以包含任 何在DTD中定义的元素内容。一般情况下,只把 文档的根元素定义为此类型,这样设定后,元素 出现的次数和顺序不受限制。
<!ELEMENT bookname(#PCDATA)> 上述bookname可以是空元素也可以包含数据内容,但是一定不能 包含子元素。如果在XML文档中定义子元素,则是非法的,例如:
<bookname> <author>张三</author> <name>XML教程</name>
DTD定义了置标语言、文档结构的语法和词汇表,实际
上是定义了一个语法分析器。
XML基础教程
第3章 有效的XML文件-DTD
第6页
DTD的分类
外 部 DTD 可 以 单 独 形 成 文 件 , 后 缀 名 为.dtd,该文件可以被多个XML文档共享和 DTD调用。 内部DTD是在XML文档中直接定义DTD, 该DTD只能被当前XML文档使用。
XML基础教程
第3章 有效的XML文件-DTD
第12页
DTD基本结构模板
DTD的基本结构包括XML声明、元素声明、属性声明、
实体声明等,DTD基本结构模板如下所示:
<!ELEMENT …> <!ELEMENT …> … <!ATTLIST …> <!ATTLIST …> … <!ENTITY…> … <!NOTATION…> XML基础教程...
XML基础教程
第3章 有效的XML文件-DTD
第17页
Unrestricted元素
Unrestricted 元素表示在XML文档中可以包含任 何在DTD中定义的元素内容。一般情况下,只把 文档的根元素定义为此类型,这样设定后,元素 出现的次数和顺序不受限制。
第三章 XML语法检 查DTD
DTD的属性声明
2、枚举类型 枚举类型并不需要使用一个关键字,它只 是将所有的属性列举出来,并以竖线分隔。枚 举类型的每一个可能值都必须遵循XML的名称 命名规则,然后就可以从这些值中选出一个作 为属性值。 例:<!- - DTD部分 - - > <!ATTLIST PET HOTSELL (TRUE|FALSE) “FALSE” > <!- - 文件元素部分- - > <PET HOTSELL = “TRUE”>热卖中!</PET>
DTD的属性声明
3、NMTOKEN类型 NMTOKEN规定属性值必须是正确的XML名称 (即必须以字母或下划线开头,后面的字符可 以为字母、数字、下划线、连字符和点号,但 不可包含空格)。 如: <!- - DTD部分 - - > <!ATTLIST CUSTOMER COUNTRY NMTOKEN #REQUIRED > <!- - 文件元素部分- - > <CUSTOMER COUNTRY=“CHN”>…… </CUSTOMER>
DTD的元素声明
3、声明空元素的声明格式: <!ELEMENT 元素名 EMPTY> • 该结构当声明的XML文档元素的内容为空时, 有效。如: <!- - DTD部分 - - > <!ELEMENT 位置 EMPTY> <!- - 文件元素部分- - > <位置></位置>
DTD的元素声明
4、声明自由类型元素的格式: <!ELEMENT 元素名 ANY> • 元素的内容可以是任何数据: 任何被声明过的元素,元素出现的顺序和次数不 受限制; 文本内容或CDATA段 例:example3.xml 5、混合类型 若某元素既包含子元素又包含已编译的字符数据,则 该元素具有混合内容。其声明的语法如下: <! ELEMENT pick (#PCDATA | one | two | three)*>
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在一份DTD中,包含了对XML文档所使用 的元素、元素间的关系、元素可用的属性、 可使用的实体等的定义规则。一份DTD实 际上是若干条有关元素、属性、实体等定 义和声明语句的集合。
DTD定义的开始 <?xml version="1.0" encoding="GB2312"?> <!DOCTYPE 学生列表[ 实体定 <!ENTITY content "2001年入学名单"> 义 <!ELEMENT 说明 (#PCDATA)> <!ELEMENT 学号 (#PCDATA)> 元素定义 <!ELEMENT 姓名 (#PCDATA)>
【参看实例: dtd_exp7_2.xml】
8. 混合型元素
还有另一种元素,其内容既可以为字符数据, 也可以为子元素,这种元素称为混合型元素。 【混合型元素的声明格式】
<!ELEMENT Element_Name(#PCDATA|Child_Ele1|Child_Ele2…)>
【注意】
混合型元素的存在破坏了文档的层次结构化,不 利于应用软件对XML 文档的处理,在XML 文档开发 过程中,它可以作为一个不成熟的DTD 文档,一步一 步地在XML 文档中添加元素,边添加边测试其正确性, 在文档最后完成时,要通过添加新元素的方法来清除 这种非结构化信息。
3.1 DTD基本概念
3.1.1 DTD简介
对XML文档所作的规范和约定被称为 DTD,也就是文档类型定义。可以把DTD 看作是编写某类XML文档的一个模板。
在一个DTD中,具体规定了引用该DTD的 XML文档可使用哪些标记、父元素中能够包括哪 些子元素、各个元素出现的先后顺序、元素可包 含的属性、元素和属性值的数据类型,以及可使 用的实体及符号规则等。 DTD由许多约定和声明语句构成,这些语 句可以包含在XML文档内部,被称为内部DTD; 也可以独立保存为一个文件,而称为外部DTD。
7. 元素组
• 在声明复合型元素的时候,可以使用括号 将其部分子元素组合在一起,成为一个元素组, 该元素组在特性上与普通元素没什么区别,可 以对其使用“?”、“*”、“+”等控制字符
【参看实例: dtd_exp7_1.xml】
• 在实际应用中,使用元素组可能不是最好 的方案。这时也可以先将准备分组的元素定义 为一个复合元素,再在原来的元素中引用刚定 义的复合元素,这样文档的结构更清晰。
2 空元素的声明
【语法】
<!ELEMENT element_name EMPTY>
【例如】
<!ELEMENT hr EMPTY>
3 不限定元素内容的声明
ANY 是DTD 中使用很频繁的一个关键字,特 别是对于文档根元素的声明。在定义一个DTD 文档 时通常很难准确地确定一个元素是否具有子元素的 情况,此时一般的做法是指定该元素的子元素为 ANY 型(表示可以是任意的元素),这样在它之中可 以包含任何数据、任何声明的子元素及其数据和子 元素的组合。 【格式】 <!ELEMENT Element_Name ANY>
3.2 DTD元素
DTD 中描述的基本部件是元素和属性,它们 负责确定XML 文档的逻辑结构。元素表示一个信 息对象,而属性表示这个对象的性质。所有元素中 有且只有一个根元素,其他的元素都是它的子元素, 除根元素外,每个元素都被其他元素包含,一个元 素可以有几个不同类型的子元素。
3.2.1 元素的基本类型
(1)一个元素可能出现一次,也可能不出现。这时 可通过在元素名后面加上一个“?” 来实现。 (0~1次) (2) 一个元素可能不出现,也可能出现多次。这 时可通过在元素名后面加上一个“*” 来实现。 (0~n次) (3) 一个元素可能出现一次,也可能出现多次, 但至少也要出现一次。这时可通过在元素名后 面加上一个“+”来实现。(1~n次)
【“#PCDATA ”的声明格式】
<!ELEMENT Element_Name (#PCDATA )>
【参看实例: #PCDATA_exp.xml】
2. 复合型
复合型元素与简单型元素相对,复合型元素 可包含其他元素。
【参看实例: dtd_exp2.xml 】
3.2.2 元素的声明
1,元素声明的基本语法
(2) 属性的声明在文档中的次序没有严格的要求, 可位于与其相连的元素声明之前或之后。
如在XML 文档中有如下语句: <bookinfo id="001" bookcategory="文艺" > </bookinfo> 属性声明可以为: <!ATTLIST bookinfo bookcategory CDATA "文艺" > <!ATTLIST bookinfo id CDATA "001"> <!ELEMENT bookinfo (#PCDATA)>
【参看实例: dtd_exp6.xml 】
6. 元素出现次数的控制
在DTD 中定义一个元素的子元素是解决该元素 可以包含什么元素,各个子元素的出现次序以及能 够出现的次数的问题。 DTD 可以在一定程度上控制出现的次数。如明 确规定一个元素出现3 次或4 次,是容易使到的,使 用上面介绍的子元素列表的设定方法即可实现,但 如果重复出现的次数较多时,这种方法就显得十分 笨拙,这时可用以下方法来对其进行控制。
元素的基本类型大致可分为两种,一种称为 简单型,另一种称为复合型。简单型具有文本数 据,即可析字符数据,该类型也称为上下文中的 “#PCADTA”;复合型可以包含其他元素和文本 数据。
1. 简单型
“#PCDATA”(Parsed Character Data) 表 示标记的内容是可解析文本,所谓的可解析文本 就是非标记文本。用“#PCDATA”规范了的元 素不能再包含子元素。 【例如】 How do you do 它是不包含标记的文本, 而How do you <list>do</list> 它就不是可解析的数据类型,因为其中包含有 标记<list> 和</list> 。
第3章 有效的XML文档与DTD
[教学目标] • 了解DTD 的作用 • 熟悉元素、属性及实体的运用 • 掌握引用DTD 的方法 • 能够为特定的系统设计标记语言
【教学提示】
XML 的可扩展性表现在用户可以自己定义标 记和标记之间的嵌套关系,而DTD 就是进行这种定 义的语言。它定义了文档的逻辑结构,规定了文档 中所使用的元素、实体、元素的属性、元素与实体 之间的关系。根据DTD 可检查XML 文档中的数据, 以验证其是否符合规定和要求,这可以保证XML 文 档数据的正确性和有效性。 本章介绍DTD 的语法,包括元素、属性和实体 的语法,结合例子给出DTD 的使用方法并给出综合 实例。
【语法】 <!ELEMENT element_name element_definition>
【说明】 • <!ELEMENT: 元素声明语句的开始,关键字 ELEMENT必须大写。 • element_name: 所声明的元素名称。 • element_definition:对该元素内容的定义, 用来规定该元素可以包含的内容。 【例如】 <!ELEMENT bookinfo (title,author,publish,price)> <!ELEMENT publisher (#PCDATA)>
【参看实例: dtd_exp8.xml】
(1)可以多次为一个元素声明其中所包含的属性。 如在XML 文档中有如下语句:
<bookinfo id="001" bookcategory="文艺" > </bookinfo> 属性声明可以为
<!ELEMENT bookinfo (#PCDATA)> <!ATTLIST bookinfo id CDATA "001"> <!ATTLIST bookinfo bookcategory CDATA "文艺" >
(3) 所有元素的属性,都要在各自所对应的标记中声明。 如在XML 文档中有如下语句:
5. 可选择的子元素
有些时候,需要在两个或多个互斥 的元素中进行选择。即多选一的情况, 如一个人的性别可以是男或女,两者中 只能有一种情况。 DTD 有专门的语法 来处理这种情况
【语法】
<!ELEMENT Element_Name(Child_Ele1|Child_Ele2|……)>
【注释】 “(Child_Ele1|Child_Ele2|…)”:为选择性元素组 合,具体使用时必须要在这个列表中选择其一。
在XML 中有一种针对复合元素的最为严 格的设定方法,称为子元素列表的设定。这 种方式下,元素都拥有哪些子元素、每个子 元素出现的次数和位置都有明确的规定,在 具体文档实现时,必须严格执行。
【语法】 <!ELEMENT Element_Name(Child_Ele1, Child_Ele2,…)> 【注释】 “(Child_Ele1, Child_Ele2,…)”:为Element_Name 所拥有的子元素列表。
3.3 DTD 属性
属性:就是元素的附加特性,在DTD 中声明元素时, 也必须对该元素的属性进行声明。
5.3.1 属性的声明
【在DTD 中,属性的声明格式】
<!ATTLIST Ele_name Attr_name TYPE Default_value>
【注释】 <!ATTLIST>为属性声明的关键字,Ele_name 为元 素名,Attr_name 为属性名,TYPE 是属性类型, Default_value 为没有设定属性值时的默认值。
DTD定义的开始 <?xml version="1.0" encoding="GB2312"?> <!DOCTYPE 学生列表[ 实体定 <!ENTITY content "2001年入学名单"> 义 <!ELEMENT 说明 (#PCDATA)> <!ELEMENT 学号 (#PCDATA)> 元素定义 <!ELEMENT 姓名 (#PCDATA)>
【参看实例: dtd_exp7_2.xml】
8. 混合型元素
还有另一种元素,其内容既可以为字符数据, 也可以为子元素,这种元素称为混合型元素。 【混合型元素的声明格式】
<!ELEMENT Element_Name(#PCDATA|Child_Ele1|Child_Ele2…)>
【注意】
混合型元素的存在破坏了文档的层次结构化,不 利于应用软件对XML 文档的处理,在XML 文档开发 过程中,它可以作为一个不成熟的DTD 文档,一步一 步地在XML 文档中添加元素,边添加边测试其正确性, 在文档最后完成时,要通过添加新元素的方法来清除 这种非结构化信息。
3.1 DTD基本概念
3.1.1 DTD简介
对XML文档所作的规范和约定被称为 DTD,也就是文档类型定义。可以把DTD 看作是编写某类XML文档的一个模板。
在一个DTD中,具体规定了引用该DTD的 XML文档可使用哪些标记、父元素中能够包括哪 些子元素、各个元素出现的先后顺序、元素可包 含的属性、元素和属性值的数据类型,以及可使 用的实体及符号规则等。 DTD由许多约定和声明语句构成,这些语 句可以包含在XML文档内部,被称为内部DTD; 也可以独立保存为一个文件,而称为外部DTD。
7. 元素组
• 在声明复合型元素的时候,可以使用括号 将其部分子元素组合在一起,成为一个元素组, 该元素组在特性上与普通元素没什么区别,可 以对其使用“?”、“*”、“+”等控制字符
【参看实例: dtd_exp7_1.xml】
• 在实际应用中,使用元素组可能不是最好 的方案。这时也可以先将准备分组的元素定义 为一个复合元素,再在原来的元素中引用刚定 义的复合元素,这样文档的结构更清晰。
2 空元素的声明
【语法】
<!ELEMENT element_name EMPTY>
【例如】
<!ELEMENT hr EMPTY>
3 不限定元素内容的声明
ANY 是DTD 中使用很频繁的一个关键字,特 别是对于文档根元素的声明。在定义一个DTD 文档 时通常很难准确地确定一个元素是否具有子元素的 情况,此时一般的做法是指定该元素的子元素为 ANY 型(表示可以是任意的元素),这样在它之中可 以包含任何数据、任何声明的子元素及其数据和子 元素的组合。 【格式】 <!ELEMENT Element_Name ANY>
3.2 DTD元素
DTD 中描述的基本部件是元素和属性,它们 负责确定XML 文档的逻辑结构。元素表示一个信 息对象,而属性表示这个对象的性质。所有元素中 有且只有一个根元素,其他的元素都是它的子元素, 除根元素外,每个元素都被其他元素包含,一个元 素可以有几个不同类型的子元素。
3.2.1 元素的基本类型
(1)一个元素可能出现一次,也可能不出现。这时 可通过在元素名后面加上一个“?” 来实现。 (0~1次) (2) 一个元素可能不出现,也可能出现多次。这 时可通过在元素名后面加上一个“*” 来实现。 (0~n次) (3) 一个元素可能出现一次,也可能出现多次, 但至少也要出现一次。这时可通过在元素名后 面加上一个“+”来实现。(1~n次)
【“#PCDATA ”的声明格式】
<!ELEMENT Element_Name (#PCDATA )>
【参看实例: #PCDATA_exp.xml】
2. 复合型
复合型元素与简单型元素相对,复合型元素 可包含其他元素。
【参看实例: dtd_exp2.xml 】
3.2.2 元素的声明
1,元素声明的基本语法
(2) 属性的声明在文档中的次序没有严格的要求, 可位于与其相连的元素声明之前或之后。
如在XML 文档中有如下语句: <bookinfo id="001" bookcategory="文艺" > </bookinfo> 属性声明可以为: <!ATTLIST bookinfo bookcategory CDATA "文艺" > <!ATTLIST bookinfo id CDATA "001"> <!ELEMENT bookinfo (#PCDATA)>
【参看实例: dtd_exp6.xml 】
6. 元素出现次数的控制
在DTD 中定义一个元素的子元素是解决该元素 可以包含什么元素,各个子元素的出现次序以及能 够出现的次数的问题。 DTD 可以在一定程度上控制出现的次数。如明 确规定一个元素出现3 次或4 次,是容易使到的,使 用上面介绍的子元素列表的设定方法即可实现,但 如果重复出现的次数较多时,这种方法就显得十分 笨拙,这时可用以下方法来对其进行控制。
元素的基本类型大致可分为两种,一种称为 简单型,另一种称为复合型。简单型具有文本数 据,即可析字符数据,该类型也称为上下文中的 “#PCADTA”;复合型可以包含其他元素和文本 数据。
1. 简单型
“#PCDATA”(Parsed Character Data) 表 示标记的内容是可解析文本,所谓的可解析文本 就是非标记文本。用“#PCDATA”规范了的元 素不能再包含子元素。 【例如】 How do you do 它是不包含标记的文本, 而How do you <list>do</list> 它就不是可解析的数据类型,因为其中包含有 标记<list> 和</list> 。
第3章 有效的XML文档与DTD
[教学目标] • 了解DTD 的作用 • 熟悉元素、属性及实体的运用 • 掌握引用DTD 的方法 • 能够为特定的系统设计标记语言
【教学提示】
XML 的可扩展性表现在用户可以自己定义标 记和标记之间的嵌套关系,而DTD 就是进行这种定 义的语言。它定义了文档的逻辑结构,规定了文档 中所使用的元素、实体、元素的属性、元素与实体 之间的关系。根据DTD 可检查XML 文档中的数据, 以验证其是否符合规定和要求,这可以保证XML 文 档数据的正确性和有效性。 本章介绍DTD 的语法,包括元素、属性和实体 的语法,结合例子给出DTD 的使用方法并给出综合 实例。
【语法】 <!ELEMENT element_name element_definition>
【说明】 • <!ELEMENT: 元素声明语句的开始,关键字 ELEMENT必须大写。 • element_name: 所声明的元素名称。 • element_definition:对该元素内容的定义, 用来规定该元素可以包含的内容。 【例如】 <!ELEMENT bookinfo (title,author,publish,price)> <!ELEMENT publisher (#PCDATA)>
【参看实例: dtd_exp8.xml】
(1)可以多次为一个元素声明其中所包含的属性。 如在XML 文档中有如下语句:
<bookinfo id="001" bookcategory="文艺" > </bookinfo> 属性声明可以为
<!ELEMENT bookinfo (#PCDATA)> <!ATTLIST bookinfo id CDATA "001"> <!ATTLIST bookinfo bookcategory CDATA "文艺" >
(3) 所有元素的属性,都要在各自所对应的标记中声明。 如在XML 文档中有如下语句:
5. 可选择的子元素
有些时候,需要在两个或多个互斥 的元素中进行选择。即多选一的情况, 如一个人的性别可以是男或女,两者中 只能有一种情况。 DTD 有专门的语法 来处理这种情况
【语法】
<!ELEMENT Element_Name(Child_Ele1|Child_Ele2|……)>
【注释】 “(Child_Ele1|Child_Ele2|…)”:为选择性元素组 合,具体使用时必须要在这个列表中选择其一。
在XML 中有一种针对复合元素的最为严 格的设定方法,称为子元素列表的设定。这 种方式下,元素都拥有哪些子元素、每个子 元素出现的次数和位置都有明确的规定,在 具体文档实现时,必须严格执行。
【语法】 <!ELEMENT Element_Name(Child_Ele1, Child_Ele2,…)> 【注释】 “(Child_Ele1, Child_Ele2,…)”:为Element_Name 所拥有的子元素列表。
3.3 DTD 属性
属性:就是元素的附加特性,在DTD 中声明元素时, 也必须对该元素的属性进行声明。
5.3.1 属性的声明
【在DTD 中,属性的声明格式】
<!ATTLIST Ele_name Attr_name TYPE Default_value>
【注释】 <!ATTLIST>为属性声明的关键字,Ele_name 为元 素名,Attr_name 为属性名,TYPE 是属性类型, Default_value 为没有设定属性值时的默认值。