DTD(Document Type Definition),即文档定义类型,是最早出现的一种 XML 约束模式语言,按照 DTD 语法创建的文件称为 DTD 文件。
1.4.1 对 DTD 的初步认识
一个 DTD 文件中可以包含元素和元素之间的关系的定义,元素的属性定义,以及实体和符号的定义。DTD 文件是文本格式的文件,后缀名通常为 .dtd。
先看例子:
book.xml:
<?xml version="1.0"?>
<书架>
<书>
<书名>Java 就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00 元</售价>
</书>
<书>
<书名>JavaScript 网页开发</书名>
<作者>张孝祥</作者>
<售价>29.00 元</售价>
</书>
</书架>
book.dtd:
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
book.dtd 定义了 book.xml 文件中的各个元素和它们的相互关系。其中的每一条 <!ELEMENT ...> 语句用于定义一个元素,<!ELEMENT ...> 语句的通用语法格式为:
<!ELEMENT 元素名称 使用规则>
例如,“<!ELEMENT 书 (书名,作者,售价)>” 语句中的 “书架” 为元素名称,“(书名,作者,售价)” 为使用规则。
元素的使用规则定义了元素中包含的组成成分,以及每种组成成分出现的次数、次序,还可以是某些成分进行某种关系组合后出现的次数、次序。例如,在 book.dtd 文件中,(#PCDATA) 用于表示元素中嵌套的内容是普通文本字符串;(书名,作者,售价) 用于表示元素中要嵌套书名、作者、售价等子元素,并且这些子元素要按顺序依次出现;在元素的使用规则中可以通过正则表达式来定义子元素出现的次数,(书+) 中的元字符 “+” 用于表示它修饰的成分必须出现一次或多次。
DTD 文件应该使用 UTF-8 或 Unicode 编码。如果 DTD 文件中的文本内容全部都是英文字符,它们本身就符合 UTF-8 编码,不需要进行特殊转换;如果 DTD 文件中的文本人内容包含中文字符,那么就需要将它们转换成 UTF-8 编码后保存。
1.4.2 在 XML 文档中引入外部 DTD 文件
XML 文档通过使用DOCTYPE 声明语句(文档类型定义语句)来指明它所遵循的 DTD 文件。DOCTYPE 声明语句紧跟在 XML 文档声明语句后面,有两种格式:
(1)<!DOCTYPE 文档类型名称 SYSTEM "DTD 文件的 URL">
(2)<!DOCTYPE 文档类型名称 PUBLIC "DTD 名称" "DTD 文件的 URL">
各部分的意义和作用如下:
① 文档定义名称:由 XML 文档编写者自己定义,一个通用的习惯是使用 XML 文档的根元素名称来作为文档类型名称。
② 关键字 SYSTEM(第一种格式)表明 XML 文件所遵循的是一个本地或组织内部所编写和使用的 DTD 文件;关键字 PUBLIC (第二种格式)表明该 XML 文件所遵循的是一个由权威机构制定的、公开提供给特定行业或公众使用的 DTD 文件,而不是某个组织内部的规范文件。
③ "DTD 名称" 用于指定该 DTD 文件的标识名称,它只有在使用关键字 PUBLIC 的 DOCTYPE 声明语句中出现。DTD 标识名称需要使用双引号(")括起来,例如,用于 Java Web 应用程序的配置文件的 DTD 文件的标识名称为 "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"。
DTD 标识名称应符合一些标准的规定,对于 ISO 标准的 DTD 以 “ISO” 三个字母开头;被改进的非 ISO 标准的 DTD 以加号 “+” 开头;未被改进的非 ISO 标准的 DTD 以减号 “-” 开头。紧跟着开始部分后面的是双斜杠 “//” 及 DTD 所有者的名称,在这个名称之后又是双斜杠 “//”,之后是 DTD 所描述的文件的说明,最后在双斜杠 “//” 之后是语言的种类。虽然标识名称看上去比较复杂,但这完全是由 DTD 文件发布者去考虑的事情,XML 文件的编写者只要把 DTD 文件发布者事先定义好的 DTD 标识名称复制到相应的位置就可以了。
④ "DTD 文件的 URL":指定 DTD 文件所在的位置,需要用双引号(")括起来。对于使用 PUBLIC 属性的 DOCTYPE 语句,"DTD 文件的 URL" 指定该 DTD 文件在 Internet 上的绝对 URL,例如,用于 Java Web 应用程序的配置文件的 DTD 文件的位置为 “http://java.sun.com/dtd/Web-app_2_3.dtd”。解析器在对 XML 文档进行有效性确认时,通常需要从该指定的 URL 下载 DTD 文件,但是,对于一些已经制定成为行业标准的 DTD 文件,一些相应的解释器程序可能已经将它们内嵌进去了,所以在解析时并不一定要到指定 URL 进行下载。对于使用 SYSTEM 属性的 DOCTYPE 语句,"DTD 文件的 URL" 除了可以是 Internet 上的一个绝对 URL 外,它还可以是一个本地文件的相对路径。例如,<!DOCTYPE 书架 SYSTEM "book.dtd">,它说明 book.dtd 文件和引用它的 XML 文件在同一个目录下。
如果想明确要求解析器必须对 XML 文档进行有效性验证,XML 声明语句中的 standalone 属性应设置为 “no” 。
例子:
book.xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE 书架 SYSTEM "book.dtd">
<书架>
<书>
<书名>Java 就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00 元</售价>
</书>
<书>
<书名>JavaScript 网页开发</书名>
<作者>张孝祥</作者>
<售价>29.00 元</售价>
</书>
</书架>
1.4.3 在 XML 文档中直接嵌入 DTD 定义语句
在 XML 文档中,还可以使用另外一种形式的 DOCTYPE 声明语句来直接包含 DTD 定义语句,格式如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 根元素名 [
DTD 定义语句
]>
例子:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>Java 就业培训教程</书名>
<作者>张孝祥</作者>
<售价>39.00 元</售价>
</书>
<书>
<书名>JavaScript 网页开发</书名>
<作者>张孝祥</作者>
<售价>29.00 元</售价>
</书>
</书架>
引用 DTD 时,最好使用引用外部 DTD 文件的方式,便于 DTD 定义的管理和维护。
在使用 DOCTYPE 声明语句引入一个外部的 DTD 文件的同时,还可以在这个 DOCTYPE 声明语句嵌入 DTD 定义语句,如下所示:
<!DOCTYPE Web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/Web-app_2_3.dtd">
[
!ELEMENT copyright SYSTEM "http://www.it315.org/copyright.xml"
]>
到这里为止,归纳总结一下 XML 文档的各个组成部分。从整体结构上来看,一个完整的 XML 文档包含如下一些组成部分:
XML 声明(declaration)
DOCTYPE 声明语句
处理指令(processing instruction)
元素(element)
注释(comment)
CDATA 区
但并不是每个 XML 文件都必须包含这些组成部分。
====== 以上内容来源于 张孝祥老师的《深入体验Java Web开发内幕 》,记录下来,只作为个人读书笔记。===========