我正在研究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 é invalid\"/>";
string validContent = "<?xml version=\"1.0\" encoding=\"utf-8\"?><key value=\"char < 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文件以及许多其他文件。知道为什么我会看到这种行为吗?
答案 0 :(得分:3)
<
是XML规范本身定义的基本实体; é
不是。这就是为什么你会看到行为的差异。 (所以我希望&
,>
,'
和"
能够发挥作用。)见http://www.w3.org/TR/REC-xml/#sec-references
我不认为 XmlResolver
在这里特别相关,因为你的XML没有引用任何其他DTD等。我认为它不适合用于< em>自动导入实体,而不引用文档本身的任何内容。