DTD DOCTYPE声明提前闭合 未在末尾]>位置正常结束问题咨询
问题根因
你的DTD存在1个会中断解析的语法错误,以及2处笔误,其中语法错误会导致解析器无法正常识别内部DTD块的结束位置,抛出DOCTYPE未正常闭合的错误:
- 语法错误:空元素声明格式违规。DTD中声明空元素时,
EMPTY是专用关键字,不能加括号包裹。你写的<!ELEMENT cabezaDeSerie (EMPTY)>属于非法语法,解析器读到这段时无法识别合法的内容模型,会直接终止内部DTD解析,部分解析器的错误位置标记不准,会提示DOCTYPE在靠前的声明位置提前闭合。 - 笔误1:根元素
torneo的内容模型混入了属性名。你已经在torneo的属性声明中定义了edicion、anteriorGanador为标签属性,不需要再把这两个名称写到子元素列表中,且你没有为这两个名称定义对应的元素规则,后续校验也会报错。 - 笔误2:
participante元素的内容模型同样混入了属性名。idP、pareja已经被定义为participante的属性(ID、IDREF类型也符合属性的使用场景),不需要出现在子元素列表中,且无对应元素声明。
修复后可正常运行的代码
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE torneo [ <!ELEMENT torneo (participante+)> <!ATTLIST torneo edicion CDATA #REQUIRED anteriorGanador CDATA #REQUIRED> <!ELEMENT participante (nombre, edad, cabezaDeSerie?)> <!ATTLIST participante idP ID #REQUIRED pareja IDREF #REQUIRED> <!ELEMENT nombre (#PCDATA)> <!ELEMENT edad (#PCDATA)> <!ELEMENT cabezaDeSerie EMPTY> ]>
特殊场景调整
如果你本来的设计是edicion、anteriorGanador为torneo的子元素而非属性,只需要做两处调整:
- 保留
torneo元素声明里的这两个子节点,删除torneo属性列表中对应的两行属性定义 - 补充两个子元素的声明规则,示例:
<!ELEMENT edicion (#PCDATA)> <!ELEMENT anteriorGanador (#PCDATA)>
同理如果idP、pareja是你设计的子元素而非属性,也按同样逻辑调整即可,但从你用的ID/IDREF类型判断,这两个为属性的概率更高。
内容的提问来源于stack exchange,提问作者juan rangel
相关产品推荐
相关产品推荐

