发新话题
移动帖子 加入精华 加入置顶 加入收藏 关注此帖

DTD学习总结





DTD学习总结

本问由作者:modongming 2008-06-18
发表在http://blog.leegang.org/article.php?type=blog&itemid=39
DTD学习总结
1、 DTD类别
1.1内部DTD
假如DTD被包含在XML源文件中,它应当通过下面的语法包装在一个DOCTYPE声明中:

<!DOCTYPE 根元素名 [
元素描述
]>

带有DTD的XML文档实例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- 内部DTD,指定了文档根元素:书籍列表 -->
<!DOCTYPE 书籍列表[
<!ELEMENT 书籍列表 (计算机书籍)*>
<!ELEMENT 计算机书籍 (书名, 作者, 价格, 简介)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 价格 (#PCDATA)>
<!ELEMENT 简介 (#PCDATA)>
]>
<!-- XML文档部分 -->
<书籍列表>
<计算机书籍>
<书名>Spring2.0宝典</书名>
<作者>李刚</作者>
<价格>79.00</价格>
<简介>该书详细介绍了Spring2.0的用法</简介>
</计算机书籍>
</书籍列表>

1.2外部DTD
假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE定义中:

<!DOCTYPE 根元素名
SYSTEM "外部DTD的URL"
>
注意:上面的URL可以是绝对路径,也可以是相对路径。

这个XML文档和内部DTD的XML文档有点不同,除了拥有一个外部的DTD外,standalone=”no”:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- 导入外部DTD -->
<!DOCTYPE 书籍列表"book.dtd">
<!-- XML文档部分 -->
<书籍列表>
<计算机书籍>
<书名>Spring2.0宝典</书名>
<作者>李刚</作者>
<价格>79.00</价格>
<简介>该书详细介绍了Spring2.0的用法</简介>
</计算机书籍>
</书籍列表>

这是包含DTD的book.dtd文件:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 书籍列表 (计算机书籍)*>
<!ELEMENT 计算机书籍 (书名, 作者, 价格, 简介)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 价格 (#PCDATA)>
<!ELEMENT 简介 (#PCDATA)>

1.3公用DTD
公用DTD实质上也是外部DTD,如果将SYSTEM替换成PUBLIC,则意味着使用公用DTD。使用公用DTD时,还需给该DTD指定一个标识名。引用公用DTD的格式如下:

<!DOCTYPE 根元素名
PUBLIC " DTD的标识名" "DTD的URL"
>
公用DTD与外部DTD的区别在于:公用DTD使用PUBLIC代替了原来的SYSTEM,并增加了DTD识别名。

2、 DTD的语法
2.1元素
在DTD中,XML元素通过元素声明来进行声明。元素声明使用下面的语法:

<!ELEMENT 元素名称 类别>

2.1.1任意类型的元素
带有任何内容(字符串、子元素、空元素)的元素,通过类别关键词ANY声明的元素,可包含任何可解析数据的组合:

<!ELEMENT 元素名称 ANY>

如:<!ELEMENT 书籍列表 ANY>

注意:应尽量避免使用ANY定义。
2.1.2空元素
空元素通过类别关键词EMPTY进行声明:

<!ELEMENT 元素名称 EMPTY>

如:<!ELEMENT 书籍列表 ANY>
XML列子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书籍列表[
<!ELEMENT 书籍列表 EMPTY>
]>
<书籍列表/>

2.1.3字符串值的元素
通过圆括号中的#PCDATA进行声明:

<!ELEMENT 元素名称 (#PCDATA)>

如:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书籍列表[
<!ELEMENT 书籍列表 (#PCDATA)>
]>
<书籍列表>描述</书籍列表>

2.1.4包含子元素
带有一个或多个子元素通过圆括号中的子元素名进行声明:
定义要求顺序的子元素:
<!ELEMENT 元素名称 (子元素名称1, 子元素名称2, ……)>
例如:
<!ELEMENT 计算机书籍 (书名, 作者, 价格, 简介)>

定义互斥的子元素:
<!ELEMENT 元素名称 (子元素名称1 | 子元素名称2 | ……)>
例如:
<!ELEMENT 计算机书籍 (书名 | 作者 | 价格 | 简介)>

2.1.5混合元素
混合元素的语法格式如下:

<!ELEMENT 父元素名称 (#PCDATA | 子元素名)*>

如:
<!ELEMENT 计算机书籍 (#PCDATA | 书名 | 作者 | 价格 | 简介)*>


补充:
子元素出现的频率:
+:表明子元素可以出现一次或多次;
*:表明子元素可以出现零次或多次;
?:表明子元素可以出现零次或一次。

2.2属性
在DTD中,属性通过ATTLIST声明来进行声明。
属性声明使用下列语法:

<!ATTLIST 元素名 属性名 属性类型 元素对属性的要求 默认值)>
其中,默认值可有可无,要求可有可无
如:
DTD实例:
<!ATTLIST 作者 地址 CDATA #REQUIRED)>

<!ATTLIST 作者 地址 CDATA #FIXED "广州" )>
XML实例:
<作者 地址="广州" >李刚</作者>

以下是属性类型的选项:
类型 属性值描述
CDATA 值为字符数据(character data)
如:<!ATTLIST 作者 地址 CDATA #REQUIRED)>
(en1 | en2 | ..) Enumerated:此值是枚举列表中的一个值
如:<!ATTLIST 肉 类型 (鸡肉 | 牛肉 | 猪肉 | 鱼肉) "猪肉")>
ID 值为唯一的id
如:<!ATTLIST 计算机书籍 ISBN ID #REQUIRED)>
IDREF 值为另外一个元素的id
如:<!ATTLIST 计算机书籍 ISBN IDREF #REQUIRED)>
IDREFS 值为其他id的列表,多个引用之间以空格隔开
ENTITY 值是一个实体
ENTITYS 值是一个实体列表,多个实体之间以空格隔开
NMTOKEN 值为合法的XML名称,表示属性值只能有字母、数字、下划线、英文点(.)、英文冒号(:)、英文中划线(-)等符号组成
NMTOKENS 值为合法的XML名称的列表,表示属性值由多个NMTOKEN组成,多个NMTOKEN之间以空格隔开
NOTATION 此值是符号的名称(过期了,尽量避免使用)

默认值参数可使用下列值:
值 解释
#REQUIRED 属性值是必需的
#IMPLIED 属性值可有可无
#FIXED value 属性值是固定的

2.3实体
实体引用就是用一个字符串代替另一个字符串。
实体可在内部或外部进行声明。

实体声明
语法:
<!ENTITY 实体名 "实体值">
在XML文档中使用实体引用的语法:
&实体名;

注意:在内部DTD和外部DTD都可以如此定义,但都是应用在XML文档中。

例子:
DTD例子:
<!ENTITY spring "Spring2.0宝典">

XML例子:
<书名> &spring;</书名>

应用在外部DTD中的实体声明
语法:
<!ENTITY % 实体名 "实体值">
在DTD中使用实体引用的语法:
%实体名;

注意:在外部DTD可以如此定义,但只能应用在外部DTD文档中。

例子:
DTD例子:
<!ENTITY % booleam "(yes|no|true|false)">
<!ATTLIST 简介 islast &booleam; #REQUIRED>
本文转载自东方标准(新东方)广州http://www.oneedu.cn/Index.htm



编辑 回复 快速回复 TOP


Re:DTD学习总结

DTD学习总结
本问由作者:modongming 2008-06-18
发表在http://blog.leegang.org/article.php?type=blog&itemid=39
DTD学习总结
1、 DTD类别
1.1内部DTD
假如DTD被包含在XML源文件中,它应当通过下面的语法包装在一个DOCTYPE声明中:

<!DOCTYPE 根元素名 [
元素描述
]>

带有DTD的XML文档实例:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- 内部DTD,指定了文档根元素:书籍列表 -->
<!DOCTYPE 书籍列表[
<!ELEMENT 书籍列表 (计算机书籍)*>
<!ELEMENT 计算机书籍 (书名, 作者, 价格, 简介)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 价格 (#PCDATA)>
<!ELEMENT 简介 (#PCDATA)>
]>
<!-- XML文档部分 -->
<书籍列表>
<计算机书籍>
<书名>Spring2.0宝典</书名>
<作者>李刚</作者>
<价格>79.00</价格>
<简介>该书详细介绍了Spring2.0的用法</简介>
</计算机书籍>
</书籍列表>

1.2外部DTD
假如DTD位于XML源文件的外部,那么它应通过下面的语法被封装在一个DOCTYPE定义中:

<!DOCTYPE 根元素名
SYSTEM "外部DTD的URL"
>
注意:上面的URL可以是绝对路径,也可以是相对路径。

这个XML文档和内部DTD的XML文档有点不同,除了拥有一个外部的DTD外,standalone=”no”:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- 导入外部DTD -->
<!DOCTYPE 书籍列表"book.dtd">
<!-- XML文档部分 -->
<书籍列表>
<计算机书籍>
<书名>Spring2.0宝典</书名>
<作者>李刚</作者>
<价格>79.00</价格>
<简介>该书详细介绍了Spring2.0的用法</简介>
</计算机书籍>
</书籍列表>

这是包含DTD的book.dtd文件:
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT 书籍列表 (计算机书籍)*>
<!ELEMENT 计算机书籍 (书名, 作者, 价格, 简介)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 价格 (#PCDATA)>
<!ELEMENT 简介 (#PCDATA)>

1.3公用DTD
公用DTD实质上也是外部DTD,如果将SYSTEM替换成PUBLIC,则意味着使用公用DTD。使用公用DTD时,还需给该DTD指定一个标识名。引用公用DTD的格式如下:

<!DOCTYPE 根元素名
PUBLIC " DTD的标识名" "DTD的URL"
>
公用DTD与外部DTD的区别在于:公用DTD使用PUBLIC代替了原来的SYSTEM,并增加了DTD识别名。

2、 DTD的语法
2.1元素
在DTD中,XML元素通过元素声明来进行声明。元素声明使用下面的语法:

<!ELEMENT 元素名称 类别>

2.1.1任意类型的元素
带有任何内容(字符串、子元素、空元素)的元素,通过类别关键词ANY声明的元素,可包含任何可解析数据的组合:

<!ELEMENT 元素名称 ANY>

如:<!ELEMENT 书籍列表 ANY>

注意:应尽量避免使用ANY定义。
2.1.2空元素
空元素通过类别关键词EMPTY进行声明:

<!ELEMENT 元素名称 EMPTY>

如:<!ELEMENT 书籍列表 ANY>
XML列子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书籍列表[
<!ELEMENT 书籍列表 EMPTY>
]>
<书籍列表/>

2.1.3字符串值的元素
通过圆括号中的#PCDATA进行声明:

<!ELEMENT 元素名称 (#PCDATA)>

如:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书籍列表[
<!ELEMENT 书籍列表 (#PCDATA)>
]>
<书籍列表>描述</书籍列表>

2.1.4包含子元素
带有一个或多个子元素通过圆括号中的子元素名进行声明:
定义要求顺序的子元素:
<!ELEMENT 元素名称 (子元素名称1, 子元素名称2, ……)>
例如:
<!ELEMENT 计算机书籍 (书名, 作者, 价格, 简介)>

定义互斥的子元素:
<!ELEMENT 元素名称 (子元素名称1 | 子元素名称2 | ……)>
例如:
<!ELEMENT 计算机书籍 (书名 | 作者 | 价格 | 简介)>

2.1.5混合元素
混合元素的语法格式如下:

<!ELEMENT 父元素名称 (#PCDATA | 子元素名)*>

如:
<!ELEMENT 计算机书籍 (#PCDATA | 书名 | 作者 | 价格 | 简介)*>


补充:
子元素出现的频率:
+:表明子元素可以出现一次或多次;
*:表明子元素可以出现零次或多次;
?:表明子元素可以出现零次或一次。

2.2属性
在DTD中,属性通过ATTLIST声明来进行声明。
属性声明使用下列语法:

<!ATTLIST 元素名 属性名 属性类型 元素对属性的要求 默认值)>
其中,默认值可有可无,要求可有可无
如:
DTD实例:
<!ATTLIST 作者 地址 CDATA #REQUIRED)>

<!ATTLIST 作者 地址 CDATA #FIXED "广州" )>
XML实例:
<作者 地址="广州" >李刚</作者>

以下是属性类型的选项:
类型 属性值描述
CDATA 值为字符数据(character data)
如:<!ATTLIST 作者 地址 CDATA #REQUIRED)>
(en1 | en2 | ..) Enumerated:此值是枚举列表中的一个值
如:<!ATTLIST 肉 类型 (鸡肉 | 牛肉 | 猪肉 | 鱼肉) "猪肉")>
ID 值为唯一的id
如:<!ATTLIST 计算机书籍 ISBN ID #REQUIRED)>
IDREF 值为另外一个元素的id
如:<!ATTLIST 计算机书籍 ISBN IDREF #REQUIRED)>
IDREFS 值为其他id的列表,多个引用之间以空格隔开
ENTITY 值是一个实体
ENTITYS 值是一个实体列表,多个实体之间以空格隔开
NMTOKEN 值为合法的XML名称,表示属性值只能有字母、数字、下划线、英文点(.)、英文冒号(、英文中划线(-)等符号组成
NMTOKENS 值为合法的XML名称的列表,表示属性值由多个NMTOKEN组成,多个NMTOKEN之间以空格隔开
NOTATION 此值是符号的名称(过期了,尽量避免使用)

默认值参数可使用下列值:
值 解释
#REQUIRED 属性值是必需的
#IMPLIED 属性值可有可无
#FIXED value 属性值是固定的

2.3实体
实体引用就是用一个字符串代替另一个字符串。
实体可在内部或外部进行声明。

实体声明
语法:
<!ENTITY 实体名 "实体值">
在XML文档中使用实体引用的语法:
&实体名;

注意:在内部DTD和外部DTD都可以如此定义,但都是应用在XML文档中。

例子:
DTD例子:
<!ENTITY spring "Spring2.0宝典">

XML例子:
<书名> &spring;</书名>

应用在外部DTD中的实体声明
语法:
<!ENTITY % 实体名 "实体值">
在DTD中使用实体引用的语法:
%实体名;

注意:在外部DTD可以如此定义,但只能应用在外部DTD文档中。

例子:
DTD例子:
<!ENTITY % booleam "(yes|no|true|false)">
<!ATTLIST 简介 islast &booleam; #REQUIRED>
本文转载自东方标准(新东方)广州http://www.oneedu.cn/Index.htm
编辑 回复 快速回复 TOP
发新话题