3

我使用单独的 .dtd 文件作为自定义 xml 文件的 doctype:

名称.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 和 names.dtd 位于同一目录中,使用http://localhost/.../names.dtd也不起作用。

<!ENTITY但是,当将内部 a<!DOCTYPE放入时,这似乎确实有效names.xml。有人可以就此提出建议吗?

4

2 回答 2

2

Firefox不加载外部 DTD(Safari 也不加载;看起来没有浏览器这样做)。如果我告诉它加载外部 DTD,您的 DTD 和 XML 在 xmllint 中工作正常:

$ 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 来解析外部实体是一个坏主意。通常不应在 Web 上使用 DOCTYPE 或 DTD。如果要验证文档,则应使用单独的模式(建议使用RELAX NG),而不是嵌入文档本身的 DTD。

于 2009-04-06T16:04:24.413 回答
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&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;">
于 2009-04-06T16:05:25.097 回答