0%

DTD学习笔记

概述

DTD(Document Type Definition)文档类型定义,是 XML 文件的验证机制,用于定义合法的 XML 文档结构。

DOCTYPE声明

DTD 可以内嵌在 XML 源文件中,也可以放在一个独立文件中引用。

1
2
3
4
5
<!-- 内部,声明在 XML 文件中  -->
<!DOCTYPE 根元素名 [元素声明]>
<!-- 外部 -->
<!DOCTYPE 根元素名 SYSTEM URL>
<!DOCTYPE 根元素名 PUBLIC identifier URL>

SYSTEM:表示私有,不适用于公开发布。
PUBLIC:公共 DTD,公共分发。
identifier:标识符,公共 DTD 必需,可以是系统上文件的路径或网络文件的 URL。

结构声明

DTD 主体部分主要描述 XML 文档结构,通常而言就是定义元素以及元素的属性。

元素声明

元素有两种格式的声明方式,一种是指定元素类别,这主要是声明一些特殊的元素;另一种是具体指定元素内容。

可选的元素类别有两种:

  • EMPTY 声明空元素。该元素在 XML 文档中写为空标签。
  • ANY 声明任意元素。该元素可包含任何可解析的数据组合。

注意:ANY 元素包含的内容要求是“可解析”的,指的是子元素必须是 DTD 中声明的元素(任意使用次数)。

1
2
3
4
5
<!ELEMENT 元素名 类别>
<!-- 空元素 -->
<!ELEMENT 元素名 EMPTY >
<!-- 任意元素 -->
<!ELEMENT 元素名 ANY>

指定的元素内容置于圆括号中,也分为两类:

  • #PCDATA,代表任意的文本内容。
  • 子元素,代表已声明的元素。

PCDATA(parsed character data),被解析的字符数据,ELEMENT 解析器会处理其中包含的实体以及标记。

1
2
3
4
5
6
7
<!ELEMENT 元素名 (元素内容)>
<!-- 文本内容 -->
<!ELEMENT 元素名 (#PCDATA)>
<!-- 子元素 -->
<!ELEMENT 元素名 (子元素名1, 子元素名2...)>
<!-- 混合内容 -->
<!ELEMENT 元素名 (#PCDATA|子元素名1|子元素名2)>

为了限制子元素在父元素中的出现次数,可以使用运算符进行控制:

运算符 语法 描述
+ <!ELEMENT 元素名 (子元素名1+)> 子元素可出现一次或多次
* <!ELEMENT 元素名 (子元素名1*)> 子元素可出现零次或多次
? <!ELEMENT 元素名 (子元素名1?)> 子元素可出现零次或一次
, <!ELEMENT 元素名 (子元素名1, 子元素名2)> 子元素序列,必须按顺序出现
| <!ELEMENT 元素名 (子元素名1, 子元素名2)> 子元素中进行选择

【注意事项】

  • , 声明的子元素序列是有严格顺序的。
  • | 声明的子元素选择是“异或”概念——仅允许出现其中之一。
  • 通常,#PCDATA 在混合内容声明中必须排第一位。

属性声明

1
<!ATTLIST 元素名 属性名 属性类型 属性值>

属性类型可选项包括以下这些:

属性类型 描述
CDATA 值为字符数据
(枚举值1|枚举值2|…) 此值是枚举列表中的一个值
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值

CDATA(character data),字符数据,解析器不处理文本中的实体及标记

属性值可以是以下这些:

属性值 描述
属性的默认值
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED 值 属性值是固定的

实体

实体是用来定义引用普通文本或特殊字符的变量。

1
<!ENTITY 实体名 实体值>

在 XML 文档中使用 &实体名; 的格式引用实体值。

示例

内部DTD

1
2
3
4
5
6
7
<!DOCTYPE tutorials [
<!ELEMENT tutorials (tutorial)+>
<!ELEMENT tutorial (name,url)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT url (#PCDATA)>
<!ATTLIST tutorials type CDATA #REQUIRED>
]>

外部DTD

1
2
3
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

元素

1
2
3
4
5
6
7
8
9
<!ELEMENT address EMPTY>
<!ELEMENT address ANY>

<!ELEMENT name (#PCDATA)>
<!ELEMENT note (to,from,header,(message|body))>
<!ELEMENT address (#PCDATA|name)*>
<!ELEMENT note (message*)>
<!ELEMENT note (message+)>
<!ELEMENT note (message?)>

属性

1
2
3
4
5
<!ATTLIST payment type CDATA "check">
<!ATTLIST sender company CDATA #FIXED "Microsoft">
<!ATTLIST contact fax CDATA #IMPLIED>
<!ATTLIST person number CDATA #REQUIRED>
<!ATTLIST payment type (check|cash) "cash">

实体

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0"?>

<!DOCTYPE book [
<!ENTITY writer "Eric Zong">
<!ENTITY copyright "©">
<!ELEMENT book (author)>
<!ELEMENT author (#PCDATA)>
]>

<book>
<author>&writer;&copyright;</author>
</book>

参考

W3school

W3Cschool

易百教程