为什么实体é无效,而实体<是什么?

时间:2014-03-10 13:44:07

标签: c# dtd xmlreader

我正在研究xml解析器System.Xml.Resolvers.XmlPreloadedResolver在dtds方面给表带来了什么,我被xml阅读器识别出实体<而不是实体é

    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文件以及许多其他文件。知道为什么我会看到这种行为吗?

1 个答案:

答案 0 :(得分:3)

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

我不认为 XmlResolver在这里特别相关,因为你的XML没有引用任何其他DTD等。我认为它不适合用于< em>自动导入实体,而不引用文档本身的任何内容。