为何我的XML方案无效?文档类型声明的标记声明需格式良好
解决XML验证报错:“文档类型声明所包含或指向的标记声明必须格式良好”
咱们一步步拆解你遇到的问题,先从最显眼的错误入手,再排查DTD相关的潜在问题:
1. 先修复XML文档本身的语法残缺
你给出的XML代码最后一行的<machine...是未完成的元素标签——既没有用/>实现自闭合,也没有对应的</machine>闭合标签,这直接破坏了XML的格式完整性,是触发报错的直接原因之一。
你可以根据实际需求补全它:
- 如果是无内容的自闭合元素:
<machine id="5" type="packer" /> - 如果是包含子元素的元素:
<machine id="5"> <model>XYZ-100</model> </machine>
修复后的完整XML示例(以自闭合machine为例):
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE system SYSTEM "system.dtd"> <system> <items> <item id="1">item1</item> </items> <stores> <store id="2"> <name>name1</name> <type>normal</type> <capacity>5</capacity> </store> </stores> <area> <slot id="4" name="name3" parallel="true"> <input id="3" name="name2"> <item></item> </input> <machine id="5" type="processor" /> </slot> </area> </system>
2. 排查DTD文件的格式与路径问题
报错提示明确提到“文档类型声明所包含或指向的标记声明必须格式良好”,所以还要检查你的system.dtd文件:
- 路径正确性:确保
system.dtd和你的XML文件在同一目录下,或者你在DOCTYPE声明里写的是正确的相对/绝对路径 - DTD内部语法:检查DTD里的元素、属性声明是否格式正确,比如:
- 元素声明是否遵循
<!ELEMENT 元素名 (子元素规则)>的正确语法 - 属性声明是否完整(比如
<!ATTLIST 元素名 属性名 属性类型 默认值>) - 有没有遗漏的括号、引号,或者错误的关键字
- 元素声明是否遵循
举个符合你XML结构的简单DTD示例(如果你的DTD有语法错误,可以参考调整):
<!ELEMENT system (items, stores, area)> <!ELEMENT items (item+)> <!ELEMENT item (#PCDATA)> <!ATTLIST item id CDATA #REQUIRED> <!ELEMENT stores (store+)> <!ELEMENT store (name, type, capacity)> <!ELEMENT name (#PCDATA)> <!ELEMENT type (#PCDATA)> <!ELEMENT capacity (#PCDATA)> <!ATTLIST store id CDATA #REQUIRED> <!ELEMENT area (slot+)> <!ELEMENT slot (input, machine)> <!ELEMENT input (item)> <!ELEMENT machine EMPTY> <!ATTLIST slot id CDATA #REQUIRED name CDATA #REQUIRED parallel (true|false) #REQUIRED> <!ATTLIST input id CDATA #REQUIRED name CDATA #REQUIRED> <!ATTLIST machine id CDATA #REQUIRED type CDATA #REQUIRED>
3. 重新验证XML文档
完成上面两步修复后,再用XML验证工具重新检查文档,确认错误是否消除。
内容的提问来源于stack exchange,提问作者Geddi
相关产品推荐
相关产品推荐

