我使用单独的.dtd文件作为自定义xml文件的doctype:
names.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name SYSTEM "names.dtd">
<names>
<name>
<text>Pepé</text>
<creator>&lost;</creator>
<history>&lost;</history>
</name>
<name>
<text>Charles</text>
<creator>James</creator>
<history>&lost;</history>
</name>
</names>
names.dtd
<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>
<!-- Placeholder/unknown history or creator name -->
<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "é">
但是,在尝试访问names.xml时,我收到以下错误:
XML解析错误:未定义的实体 地点: http://localhost/.../names.xml线 第5栏,第18栏:
<text>Pepé</text>
---------^
为了澄清,names.xml和names.dtd位于同一目录中,使用http://localhost/.../names.dtd也不起作用。
然而,将<!ENTITY
置于<!DOCTYPE
names.xml
内时,这似乎有效。有人可以就此提出建议吗?
答案 0 :(得分:2)
Firefox does not load external DTDs(Safari也没有; looks like没有浏览器可以这样做。您的DTD&amp;如果我告诉它加载外部DTD,XML在xmllint中工作正常:
$ xmllint --loaddtd names.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE names SYSTEM "names.dtd">
<names>
<name>
<text>Pepé</text>
<creator>&lost;</creator>
<history>&lost;</history>
</name>
<name>
<text>Charles</text>
<creator>James</creator>
<history>&lost;</history>
</name>
</names>
编辑:正如hsivonen在评论中指出的那样,使用DTD解析外部实体是bad idea。您通常不应在网络上使用DOCTYPE或DTD。如果要验证文档,则应使用单独的模式(建议RELAX NG用于此目的),而不是文档本身嵌入的DTD。
答案 1 :(得分:2)
如果你在Firefox中打开文档试图找出你的dtd是否正确,那就不要了。 Firefox不通过适当的xml解析器传递xml和dtd。在IE中打开您的xml文档,这将导致您的文档通过MSXML解析器。
在IE中打开xml文档时,会使用无效字符引发有关DTD的错误。您需要使用eacute的字符代码而不是字符本身。这是我开始工作的代码......
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE NAME SYSTEM "names.dtd">
<names>
<name>
<text>Pepé</text>
<creator>&lost;</creator>
<history>&lost;</history>
</name>
<name>
<text>Charles</text>
<creator>James</creator>
<history>&lost;</history>
</name>
</names>
和
<!ELEMENT name (text, creator+, history)>
<!ELEMENT text (#PCDATA)>
<!ELEMENT creator (#PCDATA)>
<!ELEMENT history (#PCDATA)>
<!ENTITY lost "Lost in the depths of time.">
<!ENTITY eacute "é">