1.4 DTD

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开发内幕 》,记录下来,只作为个人读书笔记。===========

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值