DTD中的条件部分也就是Conditional Sections,是DTD提供的用于动态控制内部内容是否生效的机制,核心通过INCLUDE和IGNORE两个关键字实现,开发者可以根据需要切换DTD中不同模块的有效性。

DTD条件部分的基本语法
条件部分的语法结构由关键字<![开头,后面跟随条件关键字,然后是具体内容,最后以]]>结束,基本格式如下:
<![ 条件关键字 [
条件内容
]]>
其中条件关键字只能是INCLUDE或者IGNORE,两者作用完全相反,INCLUDE表示条件内部的内容会被DTD解析器正常处理,IGNORE表示条件内部的内容会被解析器忽略,不会生效。
INCLUDE的使用方法
当条件部分的关键字为INCLUDE时,内部定义的DTD内容会被正常识别,相当于没有条件包裹的效果。比如我们定义一个包含可选模块的DTD,默认启用某个扩展模块:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user [
<!-- 基础用户元素定义 -->
<!ELEMENT user (name, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!-- 条件部分:启用扩展信息模块 -->
<![INCLUDE [
<!ELEMENT user (name, age, email?)>
<!ELEMENT email (#PCDATA)>
]]>
]>
<user>
<name>张三</name>
<age>25</age>
<email>test@ipipp.com</email>
</user>
上面的示例中,INCLUDE内部重新定义了user元素的子元素结构,增加了可选的email子元素,解析器会正常处理这部分内容,因此XML文档中包含email元素是合法的。
IGNORE的使用方法
当条件部分的关键字为IGNORE时,内部的所有DTD内容都会被解析器忽略,相当于这部分内容不存在。比如我们需要临时禁用某个扩展模块,只需要把INCLUDE改成IGNORE即可:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE user [
<!-- 基础用户元素定义 -->
<!ELEMENT user (name, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!-- 条件部分:禁用扩展信息模块 -->
<![IGNORE [
<!ELEMENT user (name, age, email?)>
<!ELEMENT email (#PCDATA)>
]]>
]>
<user>
<name>张三</name>
<age>25</age>
</user>
此时IGNORE内部的user元素重新定义和email元素定义都会被忽略,解析器只会使用最开始的基础user定义,因此XML文档中不能包含email元素,否则会报验证错误。
INCLUDE和IGNORE的嵌套使用
条件部分支持嵌套,外层的IGNORE会覆盖内层的INCLUDE,也就是说只要外层是IGNORE,不管内层是什么条件,内部内容都会被忽略。示例如下:
<!DOCTYPE test [
<![IGNORE [
<![INCLUDE [
<!ELEMENT test (#PCDATA)>
]]>
]]>
]>
上面的示例中,内层是INCLUDE,但外层是IGNORE,因此test元素的定义会被忽略,这个DTD不会生效任何元素定义。
使用注意事项
- 条件部分只能出现在DTD的内部子集或者外部子集的顶层,不能嵌套在其他标记声明内部。
- INCLUDE和IGNORE关键字必须大写,小写会被解析器识别为语法错误。
- 条件部分内部可以包含任意合法的DTD内容,包括元素声明、属性声明、实体声明等。
- IGNORE内部的内容即使有语法错误,解析器也不会报错,因为这部分内容完全不会被处理。
常见使用场景
条件部分最常见的场景是DTD的模块化开发,比如同一个DTD需要适配不同版本的XML文档,就可以通过INCLUDE和IGNORE切换不同版本对应的模块。另外在调试DTD时,也可以用IGNORE临时注释掉某部分有问题的定义,不需要删除代码,调试完成后再改回INCLUDE即可。
DTDConditional_SectionsINCLUDEIGNOREXML修改时间:2026-07-22 00:09:29