【问题标题】:Am I using this .DTD incorrectly, or just misunderstanding what it should be doing?我是否错误地使用了这个 .DTD,或者只是误解了它应该做什么?
【发布时间】:2012-07-24 02:07:07
【问题描述】:

感谢您阅读我的问题。我已经搜索并阅读了类似的问题,但没有一个能完全解释发生了什么。

我有一个 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="../wikiStyle.css"?>
<!DOCTYPE article SYSTEM "../article.dtd">

<article xmlns:xlink="http://www.w3.org/1999/xlink">
    <header>
        <title>Foreign relations of Malta</title>
        <id>19146</id>
    </header>

    <bdy>
        <link xlink:type="simple" xlink:href="../205/40205.xml">Albania</link>&nbsp;·
        <link xlink:type="simple" xlink:href="../588/67588.xml">Andorra</link>&nbsp;· 
    </bdy>
</article>

如您所见;我引用了 .dtd 文件,它包含如下定义:

<!ENTITY nbsp   "&#160;"> <!-- no-break space = non-breaking space,
                                  U+00A0 ISOnum -->

我的目标是在浏览器中以可读的方式显示这个 .xml 文件。 CSS 完美地管理了这一点,除了 .xml 文件,比如这个,它包含像 nbsp;

这样的元素

在这种情况下,我收到如下错误:

XML Parsing Error: undefined entity

10.1126/science.288.5472.1775</weblink>. PMID 10877698.</cite>&nbsp;</entry>

--------------------------------------------------------------^

据我了解,.dtd 中的这一行应该向浏览器声明此元素,并使我能够在我的 xml 中使用 &nbsp(并通过浏览器的解析器将其扩展为   以进行显示。

  • 我对应该发生什么的理解是正确的,还是我错过了什么?
  • 如何声明此元素以便浏览器显示它?

请注意:我正在处理数百万个这些 XML 文件,但我不生成它们。我需要一个不涉及更改 .xml 文件本身的解决方案。

【问题讨论】:

    标签: xml dtd


    【解决方案1】:

    您的实体声明看起来不错,因此可能是浏览器未加载外部 DTD 的问题。 (例如:https://developer.mozilla.org/en/XML_in_Mozilla

    我认为处理这个问题的唯一方法是将实体声明添加到每个文件的内部子集中:

    <!DOCTYPE article [
    <!ENTITY nbsp "&#160;"> <!-- no-break space = non-breaking space,
                                      U+00A0 ISOnum -->
    ]>
    

    我知道您说过您正在处理数百万个此类文件并且您不生成它们,但您可以编写 DOCTYPE 声明的更新脚本并对其进行预处理。

    【讨论】:

    • 感谢您的帮助。您对问题的诊断是正确的,只是没有读取 .dtd。至于解决方案,事实证明内部 .dtd 为每个文件添加了 30+kb,这是行不通的。暂时我发现的最佳解决方案是懒惰地手动解析我的文档,并将每个元素的每个实例替换为其等效的哈希码。
    • 如果您对浏览器的主要关注是它正确显示文档(即您正在单独验证),那么您不需要内部子集中的完整 DTD,只需要实体声明文件中提及的实体。如果您愿意接受一些手工工作,您可以将实体声明插入到内部子集中,就像用数字字符引用替换实体引用一样容易。 (如果手工工作变得太多,使用 XSLT 进行简单的身份转换是一种自动执行此类操作的简单方法。)
    • @C.M.Sperberg-McQueen - 很好的评论,我完全同意。我想知道 Paul 在评论中提到的 30+kb 是所有实体声明还是他添加了整个 DTD。我认为我的 XML 示例准确地显示了您在说什么;只有实体声明的内部子集。我还删除了公共和系统标识符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2017-04-01
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多