题
我使用一个单独的.dtd文件作为doctype为我定制的xml文件:
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>
名字。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 和名称。dtd是在同一个目录和使用 http://localhost/.../names.dtd 不会的工作。
这似乎工作时把 <!ENTITY
内部 <!DOCTYPE
在 names.xml
然而。任何人都可以就这个?
解决方案
如果你在Firefox中打开文档,试图找出如果你有正确的DTD,没有。 Firefox不通过适当的XML解析器将XML和DTD。打开XML文档在IE中,这将导致文档通过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 "é">
其他提示
Firefox 不负荷的外部Dtd (亦不Safari;它的 看起来像 没有浏览器)。你DTD&XML工作现在xmllint如果我告诉负荷的外部Dtd:
$ 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解决外部实体是一个 坏主意.你一般不应使用DOCTYPEs或Dtd在网。如果你想要验证一份文件,则应使用一个单独的架构(放松NG 建议为此目的),而不是一个DTD嵌入在该文件本身。
不隶属于 StackOverflow