目录

  1. 什么是 DTD
  2. DTD 的类型
    • 内部 DTD
    • 外部 DTD
  3. DTD 语法
    • 元素声明
    • 属性声明
    • 实体声明
  4. DTD 示例
    • 简单的 DTD 示例
    • 使用 DTD 进行验证
  5. DTD 与 XML Schema 的比较
  6. DTD 的限制
  7. 参考资料与外部链接

1. 什么是 DTD

DTD(Document Type Definition,文档类型定义)是用于定义 XML 文档结构的标准。DTD 规定了 XML 文档的元素、属性及其合法的顺序,帮助验证 XML 文档是否符合特定结构要求。它为 XML 提供了一个规则集合,可以保证 XML 文档数据的一致性。

2. DTD 的类型

DTD 可分为两种主要类型:内部 DTD 和外部 DTD。

2.1 内部 DTD

内部 DTD 是直接嵌入在 XML 文件内部的,通常定义在 <!DOCTYPE> 声明中。它的优势是简单,适用于小型项目或临时文档。

内部 DTD 示例:
<?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>

2.2 外部 DTD

外部 DTD 是定义在单独的 DTD 文件中的,并通过 DOCTYPE 声明引用到 XML 文件中。这使得多个 XML 文件可以共享相同的 DTD 定义,适用于大型项目或多个文档共享同一规则的情况。

外部 DTD 示例:

XML 文件引用外部 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>

note.dtd 文件:

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

3. DTD 语法

3.1 元素声明

在 DTD 中,元素声明用于指定元素的名称以及它们可能包含的子元素或文本内容。可以使用以下语法定义:

<!ELEMENT element-name (sub-element*)>

  • element-name:元素的名称。
  • sub-element*:该元素的子元素,可以是零个或多个子元素。

例如:

<!ELEMENT book (title, author, year)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT year (#PCDATA)>

3.2 属性声明

属性声明用于定义元素的属性及其数据类型。属性可以有默认值,也可以是必需的。常用的属性数据类型包括 CDATA(字符数据)、ID(唯一标识符)、IDREF(引用其他元素的 ID)等。

<!ATTLIST element-name attribute-name attribute-type default-value>

例如:

<!ATTLIST book id ID #REQUIRED>

  • attribute-name:属性的名称。
  • attribute-type:属性的数据类型。
  • default-value:属性的默认值,#REQUIRED 表示该属性是必需的。

3.3 实体声明

DTD 允许声明实体,实体可以是对文本的引用或外部文件的链接。

<!ENTITY entity-name "entity-value">

例如:

<!ENTITY author "John Doe">

使用实体:

<book>
  <author>&author;</author>
</book>

4. DTD 示例

4.1 简单的 DTD 示例

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book [
  <!ELEMENT book (title, author, year)>
  <!ELEMENT title (#PCDATA)>
  <!ELEMENT author (#PCDATA)>
  <!ELEMENT year (#PCDATA)>
]>
<book>
  <title>XML Tutorial</title>
  <author>John Smith</author>
  <year>2025</year>
</book>

4.2 使用 DTD 进行验证

DTD 可以帮助验证 XML 文档是否符合预定的结构。如果 XML 文档违反了 DTD 中定义的规则,解析器将会抛出错误。

5. DTD 与 XML Schema 的比较

DTD 和 XML Schema 都可以用来定义 XML 文档的结构,但它们之间有一些关键差异:

  • DTD
    • 语法简单,易于使用。
    • 不支持命名空间。
    • 只支持字符数据类型,没有内建的复杂数据类型。
  • XML Schema
    • 功能强大,支持更多的数据类型和复杂的验证规则。
    • 支持命名空间,可以定义不同命名空间的元素。
    • 语法相对复杂,但提供了更强的灵活性。

6. DTD 的限制

  • 无法支持命名空间:DTD 不支持 XML 命名空间,这意味着如果不同的 XML 文件使用相同的元素名称,可能会导致冲突。
  • 缺乏数据类型支持:DTD 只能验证元素的结构,不能对元素中的数据进行严格的数据类型验证(例如日期、整数等)。

7. 参考资料与外部链接


这是一个基础的 DTD 教程,涵盖了从定义到实际应用的方方面面。如果有任何进一步的问题或更深入的需求,请随时告诉我!