XML新手求助:转换XML到DTD时遇文档类型声明格式错误
排查DTD编译致命错误的解决方案
首先,导致这个致命错误的核心原因是你的DTD文件开头包含了XML声明:
<?xml encoding="UTF-8"?>
DTD是用于定义XML结构的标记声明语言,它本身并不是XML文档,所以不允许使用XML声明(<?xml ...?>)。这个声明会被DTD解析器当作无效标记,直接触发"markup declarations must be well-formed"的错误。
修正后的完整DTD代码
去掉开头的XML声明,同时可以简化冗余的xmlns属性声明(如果你的XML没有使用命名空间,这些声明完全不必要):
<!ELEMENT student (fName,lName,plan)> <!ATTLIST student id NMTOKEN #REQUIRED> <!ELEMENT fName (#PCDATA)> <!ELEMENT lName (#PCDATA)> <!ELEMENT plan (courses)> <!ELEMENT courses (course)+> <!ATTLIST courses year CDATA #REQUIRED> <!ELEMENT course (name,shortName,record?)> <!ELEMENT name (#PCDATA)> <!ELEMENT shortName (#PCDATA)> <!ELEMENT record (grade,date)> <!ELEMENT grade (#PCDATA)> <!ELEMENT date (#PCDATA)>
额外说明
- 关于
shortName中的CDATA段:DTD里的#PCDATA已经可以处理包含特殊字符(比如&)的文本,XML解析器会自动处理CDATA段内容,不需要在DTD中做特殊声明。 - 冗余的
xmlns属性:你之前给每个元素都加了xmlns CDATA #FIXED '',如果XML没有使用命名空间,这些声明可以直接省略,不会影响XML的验证。
这样修改后,你的DTD就能被解析器正常识别,不会再抛出致命错误了。
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

