【问题标题】:Why is entity &eacute; not valid whereas entity &lt; is?为什么实体 é 无效而实体 < 有效?
【发布时间】:2014-04-13 15:46:31
【问题描述】:

我正在查看 xml 解析器 System.Xml.Resolvers.XmlPreloadedResolver 在 dtds 方面带来的内容,但我被 xml 阅读器识别实体 &amp;lt; 而不是实体 &amp;eacute; 的事实难住了.

    private static void Main(string[] args)
    {
        string invalidContent = "<?xml version=\"1.0\" encoding=\"utf-8\"?><key value=\"char &eacute; invalid\"/>";
        string validContent = "<?xml version=\"1.0\" encoding=\"utf-8\"?><key value=\"char &lt; valid\"/>";

        XmlDocument xmlDocument = new XmlDocument();

        var xmlReaderSettings = new XmlReaderSettings()
        {
            DtdProcessing = DtdProcessing.Parse,
            XmlResolver = new XmlPreloadedResolver(XmlKnownDtds.All),
            ProhibitDtd = false
        };

        using (XmlReader reader = XmlReader.Create(new StringReader(invalidContent), xmlReaderSettings))
        {
            xmlDocument.Load(reader); // reference to undeclared entity 'eacute'
        }

        using (XmlReader reader = XmlReader.Create(new StringReader(validContent), xmlReaderSettings))
        {
            xmlDocument.Load(reader); //
        }
    }

检查 XmlPreloadedResolver 我可以看到 XmlKnownDtds.All 应该引入包含 eacute 实体以及许多其他实体的 xhtml-lat1.ent 文件。知道为什么我会看到这种行为吗?

【问题讨论】:

    标签: c# dtd xmlreader


    【解决方案1】:

    &amp;lt; 是 XML 规范本身定义的基本实体; &amp;eacute; 不是。这就是为什么你会看到行为上的差异。 (所以我希望 &amp;amp;&amp;gt;&amp;apos;&amp;quot; 也可以工作。)请参阅 http://www.w3.org/TR/REC-xml/#sec-references

    我不认为 XmlResolver 在这里特别相关,因为您的 XML 不引用任何其他 DTD 等。我认为它不应该用于 自动导入实体而不引用文档本身的任何内容。

    【讨论】:

    • 事后看来,这听起来完全合乎逻辑;但发生的事情是我获取了一个工作 web.config 文件的内容,并决定将它提供给一个 xml 阅读器。就在那时出现了关于 eacute entity 的错误。所以现在的新问题是“在读取 web.config 以让这个实体通过的过程中会发生什么?”。
    • 要么该文件引用外部 DTD(或包含一个包含 &amp;eacute; 的实体声明的嵌入式 DTD),要么该文件被读取为 HTML 而不是 XML,因为 HTML 有定义像&amp;eacute;这样的几个实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    • 2018-10-18
    相关资源
    最近更新 更多