Skip to content

DTD 简介

文档类型定义(Document Type Definition,简称 DTD)定义了 XML 文档允许的结构、元素和属性。它就像一个模式(schema)或蓝图。

使用 DTD 可确保 XML 文档遵循预定义的格式,从而根据该定义使其成为“有效”(valid)的。

DTD 可以直接在 XML 文档内声明(内部 DTD),也可以链接为外部文件(外部 DTD)。

在深入了解 DTD 之前,您应该对以下内容有基本了解:

  • 基本的 HTML 结构
  • 基本的 XML 语法(元素、属性、格式良好性)

如果这些概念对您来说是新的,请考虑先回顾一下 XML 入门资料。

为什么使用 DTD(或其他模式)?

Section titled “为什么使用 DTD(或其他模式)?”

为 XML 文档定义结构提供了多种好处:

  • 验证 (Validation): 应用可以自动检查接收到的 XML 数据是否符合预期的结构,从而防止错误。
  • 互操作性 (Interoperability): 当各方约定共同的 DTD(或模式)时,可确保数据交换时的一致性。
  • 文档 (Documentation): DTD 作为 XML 格式的文档。
  • 开发辅助 (Development Assistance): 许多 XML 编辑器和 IDE 在开发过程中使用 DTD/模式提供自动补全和验证。

虽然 DTD 是一种早期方法,但 XML Schema Definition (XSD) 是一种更现代、更强大且更广泛使用的替代方案,它提供了更丰富的数据类型和命名空间支持。然而,理解 DTD 提供基础知识。

内部 DTD 声明在 XML 文件自身内,包含在 <!DOCTYPE ... [...]> 声明中。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

DTD 部分的解释:

  • <!DOCTYPE note ...>: 定义 note 为文档的根元素。
  • <!ELEMENT note (to, from, heading, body)>: 指定 note 元素必须依次包含一个 to、一个 from、一个 heading 和一个 body 元素。
  • <!ELEMENT to (#PCDATA)>: 定义 to 元素包含解析字符数据(Parsed Character Data,即文本)。
  • <!ELEMENT from (#PCDATA)>、<!ELEMENT heading (#PCDATA)>、<!ELEMENT body (#PCDATA)>: 类似地定义这些元素包含文本。

外部 DTD 定义在单独的 .dtd 文件中。XML 文档然后使用带有 SYSTEM 或 PUBLIC 标识符的 <!DOCTYPE> 声明引用此文件。

XML 文件 (myNote.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

外部 DTD 文件 (note.dtd):

<!ELEMENT note (to, from, heading, body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>

使用外部 DTD 通常更受欢迎,因为它可重用,相同的 DTD 可以应用于多个 XML 文档。