概述
DTD(Document Type Definition)文档类型定义,是 XML 文件的验证机制,用于定义合法的 XML 文档结构。
DOCTYPE声明
DTD 可以内嵌在 XML 源文件中,也可以放在一个独立文件中引用。
1 | <!-- 内部,声明在 XML 文件中 --> |
SYSTEM:表示私有,不适用于公开发布。
PUBLIC:公共 DTD,公共分发。
identifier:标识符,公共 DTD 必需,可以是系统上文件的路径或网络文件的 URL。
结构声明
DTD 主体部分主要描述 XML 文档结构,通常而言就是定义元素以及元素的属性。
元素声明
元素有两种格式的声明方式,一种是指定元素类别,这主要是声明一些特殊的元素;另一种是具体指定元素内容。
可选的元素类别有两种:
EMPTY
声明空元素。该元素在 XML 文档中写为空标签。ANY
声明任意元素。该元素可包含任何可解析的数据组合。
注意:
ANY
元素包含的内容要求是“可解析”的,指的是子元素必须是 DTD 中声明的元素(任意使用次数)。
1 | <!ELEMENT 元素名 类别> |
指定的元素内容置于圆括号中,也分为两类:
#PCDATA
,代表任意的文本内容。- 子元素,代表已声明的元素。
PCDATA(parsed character data),被解析的字符数据,
ELEMENT
解析器会处理其中包含的实体以及标记。
1 | <!ELEMENT 元素名 (元素内容)> |
为了限制子元素在父元素中的出现次数,可以使用运算符进行控制:
运算符 | 语法 | 描述 |
---|---|---|
+ |
<!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 |
外部DTD
1 |
元素
1 | <!ELEMENT address EMPTY> |
属性
1 | <!ATTLIST payment type CDATA "check"> |
实体
1 |
|