Skip to content

XML DTD

格式良好的 XML 文档遵循基本的语法规则。而有效的 XML 文档不仅是格式良好的,还符合由模式(如 DTD 或 XSD)定义的特定结构。

DTD 是定义 XML 文档合法构建块的原始机制。

注意: 虽然 DTD 是基础性的,但 XML Schema Definition (XSD) 是更现代、更强大且通常更受欢迎的 XML 验证标准。

DTD 定义了 XML 文档的结构以及合法的元素和属性。你可以使用 DTD 来验证 XML 文档是否符合预定义的格式。

XML 文档使用 <!DOCTYPE> 声明引用其 DTD,该声明放置在可选的 XML 声明之后和根元素之前。

引用名为 Note.dtd 的外部 DTD 文件的示例:

<?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) 包含定义结构的声明。

以下是 Note.dtd 文件内容的一个示例(也可以使用方括号 [] 直接嵌入在 <!DOCTYPE> 声明中):

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

解释:

  • <!ELEMENT note (to, from, heading, body)>:定义了根元素 note,并指定它必须包含一个 to、一个 from、一个 heading 和一个 body 元素,且必须按照此特定顺序。
  • <!ELEMENT to (#PCDATA)>:定义 to 元素包含解析字符数据(Parsed Character Data),即将被解析器解析的文本。类似的定义也适用于 from、heading 和 body。

#PCDATA 本质上是文本内容,可能包含待解析的标记。

DTD 还可以声明实体,实体充当特殊字符或可重用文本片段的快捷方式。

使用内部 DTD 子集声明实体的示例:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note [
<!ENTITY nbsp "&#xA0;"> <!-- non-breaking space -->
<!ENTITY writer "Writer: Donald Duck.">
<!ENTITY copyright "Copyright: W3Schools.">
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
<footer>&writer;&nbsp;&copyright;</footer>
</note>

在此例中,&writer;、&nbsp; 和 &copyright; 在解析过程中会被替换为它们定义的值。

注意:预定义的 XML 实体,如 &lt;、&gt;、&amp;、&quot;、&apos;,无需声明。

为什么使用 DTD?(历史背景与现代替代方案)

Section titled “为什么使用 DTD?(历史背景与现代替代方案)”

历史上,DTD 被用于:

  • 为不同团体或系统之间的数据交换定义标准结构。
  • 验证接收到的 XML 数据是否符合预期格式。

然而,DTD 存在显著的局限性:

  • 不支持命名空间(namespaces)。
  • 数据类型支持非常有限(主要就是文本)。
  • DTD 语法不是基于 XML 的。
  • 与 XSD 相比,表达能力较弱。

由于这些局限性,XML Schema Definition (XSD) 现在是大多数现代应用程序中用于定义 XML 结构和验证的首选 W3C 标准。XSD 提供了强大的数据类型支持、命名空间支持,并且使用 XML 语法。

你可能仍然会在遗留系统或某些较旧的标准中遇到 DTD。

要了解更多关于现代 XML 验证的信息,请学习 XML Schema (XSD)。