使用带有XML的doctype

时间:2009-04-06 15:09:28

标签: xml dtd doctype entities

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

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>

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置于<!DOCTYPE names.xml内时,这似乎有效。有人可以就此提出建议吗?

2 个答案:

答案 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&eacute;</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&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;">