我使用一个单独的.dtd文件作为doctype为我定制的xml文件:

names.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE name SYSTEM "names.dtd">
<names>
    <name>
        <text>Pep&eacute;</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&eacute;</text>
---------^

只是为了澄清names.xml 和名称。dtd是在同一个目录和使用 http://localhost/.../names.dtd 不会的工作。

这似乎工作时把 <!ENTITY 内部 <!DOCTYPEnames.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&eacute;</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 "&#233;">

其他提示

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&eacute;</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嵌入在该文件本身。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top