您的位置:首页 > 产品设计 > UI/UE

xml笔记(三)---DTD详解

2011-03-08 20:59 197 查看
第三节 DTD详解
目前有两种xml文档定义的语义约束
1、 Dtd document type definition
2、 xml schema
xml语义约束
web.xml
<serlvet>
<servlet-name></servlet-name>
<servlet-class></servlet-class>
</servlet>
<servlet-mapping>
<servlet-name></servlet-name>
<url-pattern></url-pattern>
</servlet-mapping>
Dtd[/b]约束包括那几个方面[/b]
1、 定义xml的根元素、内容和结构
2、 定义xml文档中可以接受那些元素
3、 定义xml文档里每个元素接受的合法内容,包括是否为空,是可以是文本,可以接受那些子元素,子元素出现的顺序和子元素出现次数等。
4、 定义xml文档中每个元素能接受那些属性
5、 定义xml文档中每个属性的类型,能接受那些值,以及元素对属性的约束等。
6、 定义属性的固定值和默认值
7、 定义xml文档或dtd中可以使用的实体。
Dtd[/b]有作用[/b]
1、 Dtd采用了非xml的语法描述语义约束,可以提供如下功能
2、 通过使用dtd可以让每个xml文件带有一个有关其自身的格式描述
3、 不同的公司、组织可一致地使用某个标准的dtd来交换数据
4、 应用程序也可以使用某个标准的dtd验证所介绍的xml文档是否符合语义约束
5、 开发者也可以使用dtd来验证所创建的xml文档。
引入dtd[/b]的方式[/b]
1、 内部dtd
2、 外部dtd
3、 公用dtd
1、 内部dtd
语义约束与xml文档的内容放在同一个xml文档中。内部dtd紧跟在xml声明和处理指令之后,以<!DOCTYPE 开始,以]>结束。其语法格式如下
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE 根元素名[
元素描述
]>
xml文档主体部分
2、 外部dtd
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE 根元素名 SYSTEM "外部的DTD的URL地址">
3、 公用dtd
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE 根元素名 PUBLIC "DTD的标识名" "公用的DTD的URL地址">
定义一个元素
<!ELEMENT 元素名(子元素,)>
<!ELEMENT 元素名(#PCDATA)>
DTD的文档结构如下:
第一行是DTD声明部分 该声明与xml文档的生命语法格式相同
0到多个注释部分,DTD注释与xml文档的注释完全相同
0到多个<!ELEMENT…..>定义 每个它就是一个xml元素
0到多个<!ATTLIST…..>定义每个它就是一个xml元素的属性
0到多个<!ENTITY…..>定义每个它就是一个实体
0到多个<!NOTATION…..>定义 每个它定义一个符号
彼此之间完全独立,无须相互嵌套。
1、 [/b]定义元素[/b]
元素类型的定义的全称是:Element Type Defintion,简称ETD,它不但会定义每个文件中可能存在的元素,给元素的名称,而且会定义元素的具体类型。
元素类型描述主要有5[/b]种:[/b]
1、 任意类型
可以是以下四种的内容
语法格式:
<!ELEMENT 元素名 ANY>
2、 字符串值
3、 空元素 <br/>
4、 包含子元素
5、 混合类型
<!--任意类型-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book[
<!ELEMENT book ANY>
]>
无效的xml文档但是格式良好的xml文档
<!--空元素-->
<!ELEMENT 元素名 EMPTY>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book[
<!ELEMENT book EMPTY>
]>
有效的xml文档
<!--定义字符串内容的元素-->、
<!ELEMENT 元素名 (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT book (computer)*>
<!ELEMENT computer (book_name,price,author)>
<!ELEMENT book_name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!--定义混合内容-->
<!ELEMENT 父元素名(#PCDATA|子元素1|子元素2|子元素3|........)*> 并不是互斥
|无序的重复出现 出现的次数不受限制
注意:1、#PCDATA必须放在最前面
2、#PCDATA只能用|与各个子元素分隔
3、不要试图在各个子元素之后添加?、*、+等表示频率的修饰符
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book[
<!ELEMENT book (注意:在这之间要有空格)(computer)*>
<!ELEMENT computer (#PCDATA|book_name|price|author)>
<!ELEMENT book_name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
]>
<book>
<computer>
<book_name>JavaWeb开发</book_name>
<price>30.0</price>
<author>kouxiaolin</author>
</computer>
<computer>
<book_name>CSS应用程序的开发</book_name>
<price>1000</price>
<author>kouxiaolin</author>
</computer>
</book>
定义子元素
1、 有序的子元素(,)
(,)用于分隔有序的子元素
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book[
<!ELEMENT book (computer)*>
<!ELEMENT computer (book_name,price,author)>
<!ELEMENT book_name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
]>
<book>
<computer>
<book_name>JavaWeb开发</book_name>
<price>30.0</price>
<author> kouxiaolin </author>
</computer>
<computer>
<book_name>CSS应用程序的开发</book_name>
<price>100</price>
<author>kouxiaolin</author>
</computer>
</book>
2、 互斥的子元素
互斥的子元素表明一系列的子元素中只能出现其中之一。
(|)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book[
<!ELEMENT book (computer)*>
<!ELEMENT computer (book_name|price|author)>
<!ELEMENT book_name (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT author (#PCDATA)>
]>
<book>
<computer>
<book_name>JavaWeb开发</book_name>
</computer>
<computer>
<price>30</price>
</computer>
<computer>
<author> kouxiaolin </author>
</computer>
</book>
3、 子元素出现的频率
+: 一次或多次 (书+)
?: 0次或一次 (书?)
*: 0次或多次 (书*)
注意:混合类型的频率只能安如下方式加:
<!ELEMENT computer (#PCDATA|book_name|price|author)*>
//#PCDATA以它开头的是混合类型 频率只能在最后加
1、组合子元素
<!ELEMENT computer (book_name|price|author)>
2、 无序的子元素
1、 定义属性
<!ATTLIST属性所属元素 属性名 属性类型[元素对属性的约束][默认值]>
元素对属性的约束|默认值是可选的对于它们的使用有如下的情况:
1、 在没有指定”元素对属性的约束”时,必须为该属性增加默认值。
2、 在元素对属性的约束是:#REQUIRED时,不能为该属性指定默认值。
3、 在元素对属性的约束是:#IMPLIED时,不能为该属性指定默认值
4、 在元素对属性的约束是:#FIXED时,必须为该属性指定默认值
#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 购物车[
<!ELEMENT 购物车 (肉*,水果*,玩具)>
<!ELEMENT 肉 EMPTY>
<!ELEMENT 水果 EMPTY>
<!ELEMENT 玩具 EMPTY>
<!ATTLIST 肉 类型 (鸡肉|牛肉|狗肉) #REQUIRED>
<!ATTLIST 水果 类型 (苹果|梨|香蕉) #IMPLIED>
<!ATTLIST 玩具 类型 CDATA #FIXED "地雷">
]>
<购物车>
<肉 类型="狗肉"/>
<水果/>
<玩具 类型="地雷"/>
</购物车>

属性的类型

在属性的声明中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 所示。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE school [
<!ELEMENT school (teacher, subject*)>
<!ELEMENT teacher (#PCDATA)>
<!ELEMENT subject (#PCDATA)>
<!ATTLIST teacher
teach IDREFS #IMPLIED
>
<!ATTLIST subject
number ID #REQUIRED
>
]>
<school>
<teacher teach="c0001 c0002 c0003">
丁潇
</teacher>
<subject number="c0001">
PowerBuilder
</subject>
<subject number="c0002">
AutoCAD
</subject>
<subject number="c0003">
XML
</subject>
</school>
5. ENTITY 与ENTITIES 型
ENTITY 类型的属性提供了把外部二进制形式的文件(如.jpeg、.mp3 等)和外部不可解
析实体链接到XML文档的功能。因此其属性值也必须为不可解析的链接外部实际数据的
通用实体名。ENTITIES 类型属性的属性值可由多个不可解析的外部实体名称组成,各实体
名称之间使用空格隔开。
例 ENTITY 与ENTITIES 的使用,代码如源程序code4_11.xml 所示。

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE customers [
<!ELEMENT customers (customer*)>
<!ELEMENT customer (username, password, picture)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!ELEMENT picture EMPTY>
<!ATTLIST picture pic ENTITIES #REQUIRED
>
<!ATTLIST customer
ID #REQUIRED
>
<!ENTITY pic1 SYSTEM "a.jpg">
<!ENTITY pic2 SYSTEM "b.jpg">
<!ENTITY pic3 SYSTEM "c.jpg">
<!ENTITY pic4 SYSTEM "d.jpg">
]>
<customers>
<customer ID="c0500103">
<username>cheaperget</username>
<password>12345678</password>
<picture pic="pic1 pic2"/>
</customer>
<customer ID="c0500208">
<username>dreamingboy</username>
<password>22345678</password>
<picture pic="pic3 pic4"/>
</customer>
</customers>

本例不是所有浏览器都可以自动识别的通用格式,仅仅某些浏览器和应用程序
可能采用的在文档中嵌入非XML 数据的方法而已。
6. NMTOKEN 与NMTOKENS 型
NMTOKEN 类型的属性限定属性值是有效的XML 名称,这个属性值可以由英文、数
字、“.”、 “_ ”、“-”、“:”等组成,这里有几点需要注意。
(1) 不能包括空格。
(2) 以上字符中除“:”以外,其他字符都可以作为开头字符。
(3) “:”可以出现在中间,但由于它是命名域的关键字符,所以一般不提倡使用。
正因为NMTOKEN 类型的属性对于字符的严格要求,使得它在一些常用编程语言中,
都是合法的数据,这就为这些编程语言对XML 文档数据的操作打下了良好的基础。
NMTOKENS 类型的属性具有与NMTOKEN 属性相近的形式。这种类型的属性可以使如
下情况合法——属性由若干XML 名称组成,彼此间由空格隔开。通常可为使用NMTOKEN
属性相同的理由而使用NMTOKENS 属性,但仅仅在需要多个名字的时候。

7. NOTATION 型
XML 文档中引入了外部不可解析的实体后,解析器无法解析这些二进制文件,这时,
就可以使用NOTATION类型的属性为这些二进制文件指定与其对应的应用软件以对其进
行处理。
例 NOTATION 的使用,代码如下
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE customers [
<!ELEMENT customers (customer*)>
<!ELEMENT customer (username,password,picture)>
<!ELEMENT username (#PCDATA)>
<!ELEMENT password (#PCDATA)>
<!NOTATION mspaint SYSTEM "C:/WINDOWS/system32/mspaint.exe">
<!ELEMENT picture EMPTY>
<!ATTLIST picture pic ENTITIES #REQUIRED>
<!ATTLIST picture procedure NOTATION #REQUIRED>
<!ATTLIST customer ID ID #REQUIRED>
<!ENTITY pic1 SYSTEM "a.jpg">
<!ENTITY pic2 SYSTEM "b.jpg">
<!ENTITY pic3 SYSTEM "c.jpg">
<!ENTITY pic4 SYSTEM "d.jpg">
]>
<customers>
<customer ID="c0500103" >
<username>cheaperget</username>
<password>12345678</password>
<picture pic="pic1 pic2" procedure="mspaint"/>
</customer>
<customer ID="c0500208" >
<username>dreamingboy</username>
<password>22345678</password>
<picture pic="pic3 pic4" procedure="mspaint"/>
</customer>
</customers>
1、 [/b]定义实体[/b]
实体的概念
实体是包含了文档片段的虚拟存储单元,可用来存储XML 声明、DTD、其他形式的
文本及二进制数据等。简单来讲就是一段代码或数据的代称,这个代称即为实体的名字。
当需要在文档中引用某段代码或数据时,可以引用与这段代码或数据相对应的实体名称来
代替实体的具体内容。具有正确性检查功能的XML 处理器在提交文档给最终应用程序之
前或在显示文档以前,将先把所有不同的实体引用替换为与其对应的具体内容,从而构成
一个结构完整的文档。
实体的分类
按照实体的具体内容来分类,实体可分为可解析与不可解析两类。可解析实体的具体
内容为简单的字符、数字、文本块,而不可解析实体的具体内容则为图片、声音等二进制
文件。
按照逻辑存储来分类,实体可分为内部实体与外部实体两类。内部实体的内容是在文
档内部设定的;而外部实体则是一个外部独立的物理存储对象,如某个外部文件。
按照使用的范围来分类,实体可分为一般实体与参数实体两类。一般实体都用来构成
文档的具体内容,可出现在XML 文档中,也可出现在DTD 中;而参数实体只能出现在
DTD 中,不能出现在XML 文档中。
1. 内部一般实体
内部一般实体就是在文档实体内部定义和使用的实体,其内容通常是一段文本字符。
这种实体要在DTD 中通过DTD 语句的定义,可以在XML 文档中使用,也可在DTD 中使
用。其定义的语法格式如下:
<!ENTITY Eentity_name "Replacement" >
其中,<!ENTITY>为关键字,Eentity_name 为实体名称,Replacement 为实体所代替的
文本内容。引用内部一般实体的方法如下:
&Eentity_name;
例 内部一般实体的使用,代码如下
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title, author, publish, price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher, ISBN, pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ENTITY thepublisher "高等教育出版社">
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher> &thepublisher; </publisher>
<ISBN>7-04-014768-8</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
当内部一般实体在DTD 中引用时,有以下几方面需注意。
(1) 不能在元素及属性的声明中引用内部一般实体,如下面的语句即为非法的:
<!ENTITY pcd (#PCDATA)>
<!ELEMENT title &pcd;>
(2) 在语句中不能出现循环,如下面的语句即为非法的:

<!ENTITY thepub "北大&pub;">
<!ENTITY pub "出版社&thepub;">
2. 外部一般实体
所谓外部一般实体就是在文档实体以外定义的,要通过一个URL 才能引用到的实体。
外部一般实体为独立的文件,可被多个文档所引用。正因为每一个完整的XML 文档都是
一个合法的实体,所以XML 通过对外部一般实体的引用,可以在一个XML 文档中嵌入另
一个XML 文档,或者将多个文档组合成一个文档。其定义的语法格式如下:
<!ENTITY Eentity_name "URL" >
其中,URL 为引用的外部实体的URL 地址。引用外部一般实体也与引用内部一般实
体的方法一样:
&Eentity_name;
假如有一个XML 文档code4_14out.xml 如下:
<?xml version="1.0" encoding="gb2312" ?>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768-8</ISBN>
<pubdate>2004.6</pubdate>
</publish>
可以通过下面的例子把它作为外部实体来引用。
例 外部一般实体的使用,代码如下
<?xml version="1.0" encoding="gb2312" standalone="no"?>
<!DOCTYPE bookinfo [
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ENTITY pub SYSTEM "code4_14out.xml">
]>
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
&pub;
<price>19.7</price>
</bookinfo>
在引用外部一般实体时,有以下几方面需注意。
(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 中引用。
定义内部参数实体的语法格式如下:
<!ENTITY % Eentity_name "Replacement" >
例 内部参数实体的使用,代码如源程序code4_15.dtd 所示。
<?xml version="1.0" encoding="gb2312" ?>
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ENTITY % pub "(publisher,ISBN,pubdate)">
<!ELEMENT publish %pub;>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
<!ELEMENT price (#PCDATA)>
4. 外部参数实体
外部参数实体是指在独立的外部DTD 文档的外部定义和使用的实体,外部参数实体用
于将多个独立的DTD 文档组合成一个大的DTD 文档。定义外部参数实体的语法格式如下:
<!ENTITY % Eentity_name "URL" >
例 外部参数实体的使用,代码如下。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE bookinfo SYSTEM "code4_16_1.dtd">
<bookinfo>
<title>计算机导论</title>
<author>丁跃潮等</author>
<publish>
<publisher>高等教育出版社</publisher>
<ISBN>7-04-014768-8</ISBN>
<pubdate>2004.6</pubdate>
</publish>
<price>19.7</price>
</bookinfo>
程序code4_16_1.dtd 为
<?xml version="1.0" encoding="gb2312"?>
<!ELEMENT bookinfo (title,author,publish,price)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ENTITY % pub SYSTEM "code4_16_2.dtd">
%pub;
<!ELEMENT price (#PCDATA)>
程序code4_16_2.dtd 为
<?xml version="1.0" encoding="gb2312" ?>
<!ELEMENT publish (publisher,ISBN,pubdate)>
<!ELEMENT publisher (#PCDATA)>
<!ELEMENT ISBN (#PCDATA)>
<!ELEMENT pubdate (#PCDATA)>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息