You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的子元素而非属性,只需要做两处调整:

  1. 保留torneo元素声明里的这两个子节点,删除torneo属性列表中对应的两行属性定义
  2. 补充两个子元素的声明规则,示例:
<!ELEMENT edicion (#PCDATA)>
<!ELEMENT anteriorGanador (#PCDATA)>

同理如果idP、pareja是你设计的子元素而非属性,也按同样逻辑调整即可,但从你用的ID/IDREF类型判断,这两个为属性的概率更高。

内容的提问来源于stack exchange,提问作者juan rangel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 17:25:32