第二章 文档类型定义和命名空间
理解文档类型定义
DTD声明
元素声明
属性声明
实体声明
命名空间
什么是DTD、为什么要用DTD
文档类型定义--Document Type Definition
DTD用来描述XML文档的结构,一个DTD文档包含:
元素(ELEMENT)的定义规则
元素之间的关系规则
属性(ATTLIST)的定义规则
可使用的实体(ENTITY)或符号(NOTATION)规则
DTD文档与XML文档实例的关系
类与对象
数据库表结构与数据记录
有了DTD,每个XML文件可以携带一个自身格式的描述。
有了DTD,不同组织的人可以使用一个通用DTD用来交换数据
应用程序可以使用一个标准DTD校验从外部世界接受来的XML数据是否有效
可以使用DTD校验自己的XML数据
如何生成一个DTD文档
一。DTD文档的声明及引用
内部DTD文档 <!DOCTYPE 根元素 [定义内容]>
外部DTD文档 <!DOCTYPE 根元素 SYSTEM "DTD文件路径">
内外部DTD文档结合 <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [定义内容]>
二。一个实例
注意:例中的定义关键字一定要大写,如DOCTYPE、ELEMENT、#PCDATA,且元素名称与数据类型之间也要有空格。
元素
一。语法
<!ELEMENT NAME CONTENT>
关键字 元素名称 元素类型
二。元素类型
EMPTY-该元素不能包含子元素和文本,但可以有属性-(空元素)
ANY-该元素可以包含任何在DTD中定义的元素内容
#PCDATA-可以包含任何字符数据,但是不能在其中包含任何子元素
纯元素类型--只包含子元素,并且这些子元素外没有文本
混合类型--包含子元素和文本数据的混合体
三。EMPTY示例--空元素
<!ELEMENT 人 EMPTY>
<家庭>
<人 名字="皮诺曹" 性别="男" 年龄="6"/>
</家庭>
<家庭>
<人>皮诺曹</人>
<人><大人>皮诺曹爸爸</大人></人>
</家庭>
(错误)
四。ANY示例
<!ELEMENT 人 ANY>
<家庭>
<人>皮诺曹</人>
<人><大人>皮诺曹爸爸</大人></人>
</家庭>
将根元素设为ANY类型后,元素出现的次数和顺序不受限制。
五。#PCDATA示例
<!ELEMENT 人 (#PCDATA)>
<家庭>
<人 性别="男" 年龄="6">皮诺曹</人>
</家庭>
<家庭>
<人><大人>皮诺曹爸爸</大人></人>
</家庭>
(错误)
六。组合类型示例
<!ELEMENT 家庭 (人+, 家电*)>
<家庭>
<人 名字="郭大路" 性别="男" 年龄="25"/>
<人 名字="李寻欢" 性别="男" 年龄="38" 爱好="作个教育家和伟人"/>
<家电 名称="彩电" 数量="3"/>
</家庭>
修饰符号
符号 |
用途 |
示例 |
示例说明 |
( ) |
用来给元素分组 |
(古龙|金庸|梁羽生),(王朔|余杰),毛毛 |
分成三组 |
| |
在列出的对象中选择一个 |
(男人|女人) |
表示男人或者女人必须出现,两者至少选一 |
+ |
该对象最少出现一次,可以出现多次 (1或多次) |
(成员+) |
表示成员必须出现,而且可以出现多个成员 |
* |
该对象允许出现零次到任意多次(0到多次) |
(爱好*) |
爱好可以出现零次到多次 |
? |
该对象可以出现,但只能出现一次 (0到1次) |
(菜鸟?) |
菜鸟可以出现,也可以不出现,如果出现的话,最多只能出现一次 |
, |
对象必须按指定的顺序出现 |
(西瓜,苹果,香蕉) |
表示西瓜、苹果、香蕉必须出现,并且按这个顺序出现 |
属性
一。语法
<!ATTLIST 元素名称
属性名称 类型 属性特点
…...
>
二。属性的类型
CDATA
ID
IDREF / IDREFS
NMTOKEN / NMTOKENS
Enumerated
ENTITY / ENTITIES
NOTATION
NOTATION(enumerated)
1.属性类型- CDATA
属性值可以是任何字符(包括数字和中文)
<!ATTLIST 木偶
姓名 CDATA #REQUIRED
>
<木偶 姓名="皮诺曹"/>
<木偶 姓名="Pi Luocao"/>
<木偶 姓名="123"/>
请注意这里的CDATA与第一章CDATA的区别
#PCDATA与CDATA的区别
2.属性类型-NMTOKEN / NMTOKENS
NMTOKEN是CDATA 的一个子集,表示属性值必须是英文字母、数字、句号、破折号、下划线或冒号(不能是中文!)。
NMTOKENS与NMTOKEN类似,包含多个由空格分隔的字符。
<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE poems[
<!ELEMENT poems (title,content)>
<!ELEMENT title (#PCDATA)>
<!ATTLIST title author NMTOKEN #REQUIRED>
<!ELEMENT content (#PCDATA)>
]>
<poems>
<title author="dupu">八阵图</title>
<content>
功盖三分国,名成八阵图,
江流石不转,遗恨失吞吴.
</content>
</poems>
<poems>
<title author="杜甫">八阵图</title>
<content>
功盖三分国,名成八阵图,
江流石不转,遗恨失吞吴.
</content>
</poems>
(错误)
3. 属性类型- ID
表明该属性的取值必须是唯一的。 ID属性值必须是合格的XML名字
<!ELEMENT 公司职员 ANY>
<!ATTLIST 公司职员
编号 ID #REQUIRED
姓名 CDATA #REQUIRED
>
<公司职员 编号="Z001" 姓名="张三"/>
<公司职员 编号="Z002" 姓名="李四"/>
<公司职员 编号="Z001" 姓名="张三"/>
<公司职员 编号="Z001" 姓名="李四"/>
(错误)
IDREF属性的值指向文档中其它地方声明的ID类型的值。
IDREFS同IDREF,但是可以具有由空格分开的多个引用。
<!ELEMENT 家庭 (人+)>
<!ELEMENT 人 EMPTY>
<!ATTLIST 人
relID ID #REQUIRED
parentID IDREFS #IMPLIED
name CDATA #REQUIRED
>
<家庭>
<人 relID="P_1" name="爸爸"/>
<人 relID="P_2" name="妈妈"/>
<人 relID="P_3" parentID="P_1 P_2" name="儿子">
</家庭>
空格
5. 属性类型-Enumerated
事先定义好一些值,属性的值必须在所列出的值的范围内。
<!ATTLIST person
婚姻状态 (single|married|divorced|widowed) #IMPLIED>
<!ATTLIST persion 性别 (男|女) #REQUIRED>
6. 属性类型ENTITY / ENTITIES
ENITITY类型的属性的值必须对应一个在DTD文档内声明的实体。通常用来处理外部的二进制数据文件,如图形、音效等
ENTITIES类型的属性的值与ENITITIES类似,不同的是可以包含多个由空格分开的实体。
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE library[
<!ELEMENT library (number,img)>
<!ELEMENT number (#PCDATA)>
<!ELEMENT img EMPTY>
<!ATTLIST img src ENTITIES #REQUIRED>
<!ENTITY pic SYSTEM "pic1.gif">
]>
<library>
<number> A001 </number>
<img src="&pic;"/>
</library>
7. 属性类型-NOTATION
属性的值必须引用已在DTD文档其它地方声明过的某个注解的名称。
<!NOTATION mpeg SYSTEM "mplayer.exe">
<!ATTLIST media
player NOTATION (mpeg) #REQUIRED>
附注:定义符号NOTATION
Notation主要是用来表明文档中需要来自外部源的数据,而该数据XML本身是不能进行解析的,比如各种格式的二进制文件(比如图形文件、声音文件等),需要外部的应用程序进行处理。
Notation声明的语法格式为: <!NOTATION NAME ExternalID>
需要注意的是NAME必须由字母、数字、句点、破折号或冒号组成,并且第一个字符必须为字母或者是下划线。
下面的例子表示GIF图象作为不解析的外部内容。
<!NOTATION gif system "iexplore.exe">
<!ENTITY logo SYSTEM "http://somewebsite/somecategory/something.gif" NDATA gif>
<!-- 这里NDATA表示XML不解析该数据 -->
<!ELEMENT PIC EMPTY>
<!ATTLIST PIC
loc ENTITY #REQUIRED
>
然后,在具体的实例化文档中包含下面一行代码:<PIC loc="&logo;" />
根据DTD定义,loc属性值是一个不解析的实体。解析器可以根据DTD定义知道这一点,然后它就不对其进行解析,也不会象解析实体一样把它包括到XML文档里面。同时,XML解析器将通知iexplore.exe该引用的存在。
8. 属性类型-NOTATION(enumerated)
属性的值必须匹配NOTATION名称列表中的某个名称。
<!NOTATION mpeg SYSTEM "mplayer.exe">
<!NOTATION jpeg SYSTEM "netscape.exe">
<!ATTLIST media
player NOTATION ( mpeg | jpeg ) #REQUIRED>
三。属性特点
#REQUIRED
#IMPLIED
#FIXED value
Default value
1. 属性的特点-#REQUIRED
元素的所有实例都必须有该属性的值(NOT NULL)
语法:
<!ATTLIST 元素名 属性名 属性类型 #REQUIRED>
DTD 示例:
<!ATTLIST person number CDATA #REQUIRED>
XML 示例:
<person number="5677" />
2. 属性的特点-#IMPLIED
元素的实例中可以忽略该属性(NULL)。
语法:
<!ATTLIST 元素名 属性名 属性类型 #IMPLIED>
DTD示例:
<!ATTLIST contact fax CDATA #IMPLIED>
XML示例:
<contact fax="555-667788" />
3.属性的特点-#FIXED value
元素实例中该属性的值必须为指定的固定值。
语法:
<!ATTLIST 元素名 属性名 类型 #FIXED "value">
DTD示例:
<!ATTLIST sender company CDATA #FIXED "Microsoft">
XML示例:
<sender company="Microsoft" />
4. 属性的特点-Default value
为属性提供一个默认的值
语法:
<!ATTLIST 元素名 属性名 类型 "value">
DTD示例:
<!ATTLIST payment type CDATA "check">
XML示例:
<payment type="check" />
实体
一。定义实体
内部实体
语法:
<!ENTITY 实体名 "实体值">
DTD 示例:
<!ENTITY writer "Donald Duck.">
<!ENTITY copyright "Copyright W3Schools.">
XML 示例:
<author>&writer;©right;</author>
外部实体
语法:
<!ENTITY 实体名 SYSTEM "URI/URL">
DTD 示例:
<!ENTITY writer SYSTEM "http://www.w3schools.com/entities/entities.xml">
<!ENTITY copyright SYSTEM "http://www.w3schools.com/entities/entities.dtd">
XML 示例:
<author>&writer;©right;</author>
二。