DTD <!DOCTYPE>

如果您查看某些XML文档,可能已经注意到一行以<!DOCTYPE开头出现在文档顶部附近。

如果您查看过(有效)XHTML文件的源代码,可能会看到如下所示的行:

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

此行的目的是声明文档类型定义(DTD)。 实际上,是使用了!DOCTYPE声明来定义实体。DTD指定了有关XML文档中元素的规则。

1. DOCTYPE语法

要在XML文档中使用DTD,需要声明它。 DTD可以是内部的(写入正在使用的文档中),也可以是外部的(位于另一个文档中)。

使用!DOCTYPE声明在XML文档的顶部(在prolog中)声明了一个DTD。 基本语法是:

<!DOCTYPE rootname [DTD]>

其中,rootname是根元素,[DTD]是实际定义。

实际上,根据DTD是内部还是外部(或两者),公共或私人,有一些细微的变化。 它们概述如下。

DTD的变化

<!DOCTYPE rootname [DTD]>

这是一个内部DTD(DTD在XML文档中的方括号之间定义)。

示例

<!DOCTYPE tutorials [
<!ELEMENT tutorials (tutorial)+>
<!ELEMENT tutorial (name,url)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT url (#PCDATA)>
<!ATTLIST tutorials type CDATA #required>
]>

<!DOCTYPE rootname SYstem URL>

  • 关键字SYstem表示它是私有DTD(不适用于公开发布)。
  • URL[DTD]的存在表明这是一个外部和内部DTD(DTD的一部分在位于URL的文档中定义,另一部分在XML文档中定义)。

示例

<!DOCTYPE tutorials SYstem tutorials.dtd>

<!DOCTYPE rootname SYstem URL [DTD]>

  • 关键字SYstem表示它是私有DTD(不适用于公开发布)。
  • URL[DTD]的存在表明这是一个外部和内部DTD(DTD的一部分在位于URL的文档中定义,另一部分在XML文档中定义)。

示例

<!DOCTYPE tutorials SYstem tutorials.dtd [
<!ELEMENT tutorial (summary)>
<!ELEMENT summary (#PCDATA)>
]>

<!DOCTYPE rootname PUBLIC identifier URL>

  • 关键字PUBLIC表示它是公共DTD(用于公共分发)。
  • URL的存在表明这是一个外部DTD(DTD在位于URL的文档中定义)。
  • 标识符表示正式的公共标识符,在使用公共DTD时是必需的。

示例

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