xml笔记(三)---DTD详解
第三节 DTD详解
目前有两种xml文档定义的语义约束
1、
2、
xml语义约束
web.xml
Dtd约束包括那几个方面
1、
2、
3、
4、
5、
6、
7、
Dtd有作用
1、
2、
3、
4、
5、
引入dtd的方式
1、
2、
3、
1、
语义约束与xml文档的内容放在同一个xml文档中。内部dtd紧跟在xml声明和处理指令之后,以开始,以]>结束。其语法格式如下
根元素名[
元素描述
]>
xml文档主体部分
2、
根元素名 SYSTEM "外部的DTD的URL地址">
3、
根元素名 PUBLIC "DTD的标识名" "公用的DTD的URL地址">
定义一个元素
元素名(子元素,)>
元素名(#PCDATA)>
DTD的文档结构如下:
第一行是DTD声明部分 该声明与xml文档的生命语法格式相同
0到多个注释部分,DTD注释与xml文档的注释完全相同
0到多个定义 每个它就是一个xml元素
0到多个定义每个它就是一个xml元素的属性
0到多个定义每个它就是一个实体
0到多个定义 每个它定义一个符号
彼此之间完全独立,无须相互嵌套。
1、
元素类型的定义的全称是:Element Type Defintion,简称ETD,它不但会定义每个文件中可能存在的元素,给元素的名称,而且会定义元素的具体类型。
元素类型描述主要有5种:
1、
可以是以下四种的内容
语法格式:
元素名 ANY>
2、
3、
4、
5、
]>
无效的xml文档但是格式良好的xml文档
元素名 EMPTY>
]>
有效的xml文档
、
元素名 (#PCDATA)>
父元素名(#PCDATA|子元素1|子元素2|子元素3|........)*> 并不是互斥
|无序的重复出现 出现的次数不受限制
注意:1、#PCDATA必须放在最前面
2、#PCDATA只能用|与各个子元素分隔
3、不要试图在各个子元素之后添加?、*、+等表示频率的修饰符
xml version="1.0" encoding="UTF-8"?>
DOCTYPE book[
book (注意:在这之间要有空格)(computer)*>
computer (#PCDATA|book_name|price|author)>
book_name (#PCDATA)>
price (#PCDATA)>
author (#PCDATA)>
]>
<book>
<computer>
<book_name>JavaWeb开发book_name>
<price>30.0price>
<author>kouxiaolinauthor>
computer>
<computer>
<book_name>CSS应用程序的开发book_name>
<price>1000price>
<author>kouxiaolinauthor>
computer>
book>
定义子元素
1、
(,)用于分隔有序的子元素
xml version="1.0" encoding="UTF-8"?>
DOCTYPE book[
book (computer)*>
computer (book_name,price,author)>
book_name (#PCDATA)>
price (#PCDATA)>
author (#PCDATA)>
]>
<book>
<computer>
<book_name>JavaWeb开发book_name>
<price>30.0price>
<author> kouxiaolin author>
computer>
<computer>
<book_name>CSS应用程序的开发book_name>
<price>100price>
<author>kouxiaolinauthor>
computer>
book>
2、
互斥的子元素表明一系列的子元素中只能出现其中之一。
(|)
xml version="1.0" encoding="UTF-8"?>
DOCTYPE book[
book (computer)*>
computer (book_name|price|author)>
book_name (#PCDATA)>
price (#PCDATA)>
author (#PCDATA)>
]>
<book>
<computer>
<book_name>JavaWeb开发book_name>
computer>
<computer>
<price>30price>
computer>
<computer>
<author> kouxiaolin author>
computer>
book>
3、
+: 一次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次 (书*)
注意:混合类型的频率只能安如下方式加:
computer (#PCDATA|book_name|price|author)*>
//#PCDATA以它开头的是混合类型 频率只能在最后加
1、组合子元素
computer (book_name|price|author)>
2、
1、
属性所属元素 属性名 属性类型[元素对属性的约束][默认值]>
元素对属性的约束|默认值是可选的对于它们的使用有如下的情况:
1、
2、
3、
4、
#REQUIRED:必须的属性
#IMPLIED:可有可无
#FIXED:固定值
<水果 品名=”苹果” 颜色=”绿色”>关于水果的元素水果>
属性类型
| 类型 | 说明 |
| CDATA | 字符串数据 character data |
| (e1|e2|e3) | 该属性是一系列枚举值之一 |
| ID | Id必须是唯一的 |
| IDREF | 引用自己已经定义的id |
| IDREFS | 空格区分多个id |
| ENTITY | 是一个外部的实体 |
| ENTITIES | 多个外部实体,多个外部实体之间用空格分隔 |
| Xml: | 预定义的xml值 |
xml version="1.0" encoding="UTF-8"?>
DOCTYPE 购物车[
购物车 (肉*,水果*,玩具)>
肉
水果
玩具
肉
水果 类型 (苹果|梨|香蕉) #IMPLIED>
玩具
]>
<购物车>
<肉
<水果/>
<玩具
购物车>
属性的类型
在属性的声明中TYPE 部分为属性的类型设定,DTD 中属性的类型有10 种,下面将
对这些数据类型进行逐一的介绍。
1. CDATA 型
CDATA 型表明属性值为不包含“< ”和“"”的任意字符串,如果属性值中需要包含
“<”和“"”,则可使用特殊字符来代替。
2. Enumerated 型
如果属性值并不是任意的字符串,而是在几个可能的值中进行选择,如书籍的“类别”
属性,其值可为“文艺”,也可为“自然科学”,而不可能为其他情况时,则可以将书籍
的“类别”属性设定为Enumerated 型。
3. ID 型
当元素的某个属性值是不能重复时,如书籍的ISBN 属性、个人的“身份证号”属性
等,要定义这样的属性则需使用属性的ID 类型。在一个XML 文档中,所有元素的ID
类型属性的属性值必须是唯一的,不可重复,另外,一个元素不能有超过一个ID 类型的
属性。
4. IDREF 与IDREFS 型
IDREF 为Identifier Reference 的缩写,IDREF 与ID 类型属性的关系为子元素与父元素
的关系,即IDREF 类型属性的值必须是其他元素的ID 类型属性的值,且该ID 类型属性的
值必须在文档的其他地方被设定过。IDREFS 类型属性的属性值可有多个,每一个都必须
是在文档其他地方被设定了的ID 类型属性的值,而这多个属性值之间用空格隔开。
例 IDREFS 的使用,代码如源程序code4_10.xml 所示。
teach IDREFS #IMPLIED
>
number ID #REQUIRED
>
]>
丁潇
PowerBuilder
AutoCAD
XML
5. ENTITY 与ENTITIES 型
ENTITY 类型的属性提供了把外部二进制形式的文件(如.jpeg、.mp3 等)和外部不可解
析实体链接到XML文档的功能。因此其属性值也必须为不可解析的链接外部实际数据的
通用实体名。ENTITIES 类型属性的属性值可由多个不可解析的外部实体名称组成,各实体
名称之间使用空格隔开。
例 ENTITY 与ENTITIES 的使用,代码如源程序code4_11.xml 所示。
>
ID #REQUIRED
>
]>
本例不是所有浏览器都可以自动识别的通用格式,仅仅某些浏览器和应用程序
可能采用的在文档中嵌入非XML 数据的方法而已。
6. NMTOKEN 与NMTOKENS 型
NMTOKEN 类型的属性限定属性值是有效的XML 名称,这个属性值可以由英文、数
字、“.”、 “_ ”、“-”、“:”等组成,这里有几点需要注意。
(1) 不能包括空格。
(2) 以上字符中除“:”以外,其他字符都可以作为开头字符。
(3) “:”可以出现在中间,但由于它是命名域的关键字符,所以一般不提倡使用。
正因为NMTOKEN 类型的属性对于字符的严格要求,使得它在一些常用编程语言中,
都是合法的数据,这就为这些编程语言对XML 文档数据的操作打下了良好的基础。
NMTOKENS 类型的属性具有与NMTOKEN 属性相近的形式。这种类型的属性可以使如
下情况合法——属性由若干XML 名称组成,彼此间由空格隔开。通常可为使用NMTOKEN
属性相同的理由而使用NMTOKENS 属性,但仅仅在需要多个名字的时候。
7. NOTATION 型
XML 文档中引入了外部不可解析的实体后,解析器无法解析这些二进制文件,这时,
就可以使用NOTATION类型的属性为这些二进制文件指定与其对应的应用软件以对其进
行处理。
例 NOTATION 的使用,代码如下
]>
1、
实体的概念
实体是包含了文档片段的虚拟存储单元,可用来存储XML 声明、DTD、其他形式的
文本及二进制数据等。简单来讲就是一段代码或数据的代称,这个代称即为实体的名字。
当需要在文档中引用某段代码或数据时,可以引用与这段代码或数据相对应的实体名称来
代替实体的具体内容。具有正确性检查功能的XML 处理器在提交文档给最终应用程序之
前或在显示文档以前,将先把所有不同的实体引用替换为与其对应的具体内容,从而构成
一个结构完整的文档。
实体的分类
按照实体的具体内容来分类,实体可分为可解析与不可解析两类。可解析实体的具体
内容为简单的字符、数字、文本块,而不可解析实体的具体内容则为图片、声音等二进制
文件。
按照逻辑存储来分类,实体可分为内部实体与外部实体两类。内部实体的内容是在文
档内部设定的;而外部实体则是一个外部独立的物理存储对象,如某个外部文件。
按照使用的范围来分类,实体可分为一般实体与参数实体两类。一般实体都用来构成
文档的具体内容,可出现在XML 文档中,也可出现在DTD 中;而参数实体只能出现在
DTD 中,不能出现在XML 文档中。
1. 内部一般实体
内部一般实体就是在文档实体内部定义和使用的实体,其内容通常是一段文本字符。
这种实体要在DTD 中通过DTD 语句的定义,可以在XML 文档中使用,也可在DTD 中使
用。其定义的语法格式如下:
Eentity_name "Replacement" >
其中,为关键字,Eentity_name 为实体名称,Replacement 为实体所代替的
文本内容。引用内部一般实体的方法如下:
&Eentity_name;
例 内部一般实体的使用,代码如下
高等教育出版社">
]>
当内部一般实体在DTD 中引用时,有以下几方面需注意。
(1) 不能在元素及属性的声明中引用内部一般实体,如下面的语句即为非法的:
pcd (#PCDATA)>
title &pcd;>
(2) 在语句中不能出现循环,如下面的语句即为非法的:
thepub "北大&pub;">
pub "出版社&thepub;">
2. 外部一般实体
所谓外部一般实体就是在文档实体以外定义的,要通过一个URL 才能引用到的实体。
外部一般实体为独立的文件,可被多个文档所引用。正因为每一个完整的XML 文档都是
一个合法的实体,所以XML 通过对外部一般实体的引用,可以在一个XML 文档中嵌入另
一个XML 文档,或者将多个文档组合成一个文档。其定义的语法格式如下:
Eentity_name "URL" >
其中,URL 为引用的外部实体的URL 地址。引用外部一般实体也与引用内部一般实
体的方法一样:
&Eentity_name;
假如有一个XML 文档code4_14out.xml 如下:
可以通过下面的例子把它作为外部实体来引用。
例 外部一般实体的使用,代码如下
]>
&pub;
在引用外部一般实体时,有以下几方面需注意。
(1) 因为在一个文档中需引用某些外部文件,所以该文档声明中的standalone 属性不再
是默认值yes,而应该为no 。
(2) 作为外部一般实体的文档,若使用的是XML 的默认字符集即UTF-8 或UNICODE,
则可以在文档头部不进行XML 声明,否则,必须有XML 声明,且声明时,一定要说明
ecoding 属性。
3. 内部参数实体
内部参数实体是指在独立的外部DTD 文档的内部定义和使用的实体,其内容为仅能为
DTD 而非XML 文档内容的书写文本。这里提到参数实体与前面所讲的一般实体是有区
别的:
(1) 在引用形式上,一般实体的引用为“&Eentity_name;”,而参数实体的引用则为
“%Eentity_name;”
(2) 在引用范围上,一般实体可在XML 文档中引用,也可在DTD 中引用,而参数实
体只可在DTD 中引用。
定义内部参数实体的语法格式如下:
例 内部参数实体的使用,代码如源程序code4_15.dtd 所示。
4. 外部参数实体
外部参数实体是指在独立的外部DTD 文档的外部定义和使用的实体,外部参数实体用
于将多个独立的DTD 文档组合成一个大的DTD 文档。定义外部参数实体的语法格式如下:
例 外部参数实体的使用,代码如下。
程序code4_16_1.dtd 为
%pub;
程序code4_16_2.dtd 为
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
