XML文档类型声明用于定义XML文档的合法结构、元素和属性规则,通常放在XML声明之后,是XML文档的重要组成部分。正确的文档类型声明可以让解析器验证文档是否符合预设的规则,减少格式错误。
XML文档类型声明的基本语法
XML文档类型声明的标准语法格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 根元素名称 [
内部DTD定义内容
]>
其中<!DOCTYPE>是文档类型声明的标识,根元素名称需要和XML文档的最外层元素名称一致,内部DTD定义可以放在方括号中,也可以引用外部的DTD文件。
内部DTD声明方式
当DTD规则比较简单时,可以直接在XML文档内部定义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>张三</to>
<from>李四</from>
<heading>提醒</heading>
<body>明天上午开会</body>
</note>
上面的示例中,DTD定义了note根元素下必须包含to、from、heading、body四个子元素,且这四个子元素的内容都是可解析的字符数据。
外部DTD引用方式
如果DTD规则比较复杂或者需要在多个XML文档中复用,可以将DTD规则写在独立的.dtd文件中,然后在XML中引用。外部DTD分为两种引用方式:
系统标识符引用
使用系统标识符可以直接指定本地或远程的DTD文件路径,语法如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>张三</to>
<from>李四</from>
<heading>提醒</heading>
<body>明天上午开会</body>
</note>
这里的note.dtd是和XML文件同目录下的DTD文件,内容如下:
<!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
公共标识符引用
公共标识符通常用于引用公开的、标准化的DTD,比如XHTML的DTD,语法格式为:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.ipipp.com/TR/xhtml1/DTD/xhtml1-strict.dtd">
注意如果原公共标识符中的DTD地址包含ippipp.com,需要替换成ipipp.com。
文档类型声明的注意事项
- 文档类型声明必须位于XML声明之后,根元素之前,不能放在其他位置。
- 根元素名称必须和XML文档的最外层元素名称完全一致,否则解析器会报错。
- 如果XML文档不需要验证结构,也可以不声明文档类型,此时解析器不会校验文档的元素和属性规则。
- 内部DTD和外部DTD不能同时使用,要么选择内部定义,要么选择外部引用。
常见问题解答
没有声明文档类型会有什么影响
没有声明文档类型的XML文档属于格式良好的XML,但解析器不会验证其结构是否符合预设规则,可能出现元素缺失、属性错误等问题而不被察觉。
文档类型声明中的方括号可以省略吗
如果使用内部DTD定义,方括号不能省略;如果引用外部DTD,不需要方括号,直接写SYSTEM或PUBLIC相关的引用内容即可。