XML新手应用DTD遇报错:‘Element type "chat" must be declared’求解决方案及替代方案
解决XML DTD报错&更优应用方案
嘿,作为XML新手碰到这种DTD声明问题太正常啦,我来帮你一步步解决~
先搞定当前的报错问题
你遇到的Element type "chat" must be declared错误,核心原因是你的XML根元素是<chat>,但内部DTD里完全没声明这个元素——解析器找不到<chat>的定义规则,就会抛出这个错误。
你的XML里<chat>是根节点,里面包含多个<note>元素,所以需要在DTD里补充<chat>的声明,指定它可以包含一个或多个<note>。修正后的完整代码如下:
<!DOCTYPE chat [ <!ELEMENT chat (note+)> <!-- 新增:定义chat元素,包含至少1个note --> <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)> ]> <chat> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> </chat>
这里(note+)里的+表示允许<chat>包含一个或多个<note>元素,完全匹配你当前XML的结构。
除了内部DTD,还有这些更优的应用方式
你现在用的是内部DTD(把DTD规则写在XML文档内部),适合小文档、快速测试,但如果是多文档共用同一规范,或者需要统一维护规则,更推荐下面两种外部DTD方案:
1. 外部私有DTD(最常用的项目级方案)
把DTD规则单独存成一个.dtd文件,比如命名为chat.dtd,内容如下:
<!ELEMENT chat (note+)> <!ELEMENT note (to,from,heading,body)> <!ELEMENT to (#PCDATA)> <!ELEMENT from (#PCDATA)> <!ELEMENT heading (#PCDATA)> <!ELEMENT body (#PCDATA)>
然后在XML文档里通过SYSTEM关键字引用这个本地文件:
<!DOCTYPE chat SYSTEM "chat.dtd"> <chat> <!-- 你的XML内容 --> </chat>
优点:多个XML文档可以共用同一个DTD,规则修改只需改一次.dtd文件,维护成本低,XML代码也更简洁。
2. 外部公共DTD(行业通用规范场景)
如果是遵循行业通用的XML规范(比如XHTML、RSS等),可以使用公共DTD,通过PUBLIC关键字引用,格式是:
<!DOCTYPE 根元素名 PUBLIC "公共标识符" "DTD文件URL">
举个XHTML的例子:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
适用场景:你的XML需要符合公开的行业标准时使用,无需自己编写DTD规则。
三种DTD方式对比
- 内部DTD:简单直接,适合单文档、临时测试;缺点是规则无法复用,XML文档冗余。
- 外部私有DTD:规则复用性强,便于维护,适合企业内部项目的多XML文档场景。
- 外部公共DTD:遵循行业标准,无需自定义规则,适合通用规范场景。
内容的提问来源于stack exchange,提问作者Parth Manaktala
相关产品推荐
相关产品推荐

