防止XmlTextReader扩展实体。

9
我正在尝试读取一个XML文档,但不扩展实体,对其进行一些操作,并将其重新保存为最初的未扩展实体。使用XDocument直接操作时,它无法加载并抛出异常,告诉我它有未扩展的实体。
XDocument doc = XDocument.Load(file);  // <--- Exception
// ... do some manipulation to doc
doc.Save(file2);

异常:引用未声明的实体“entityname”。

接下来我尝试将 XmlTextReader 传递给 XDocument 构造函数,但是 EntityHandling 属性没有 "no expand":

XmlTextReader xmlReader = new XmlTextReader(file));
xmlReader.EntityHandling = EntityHandling.ExpandCharEntities;
XDocument doc = XDocument.Load(xmlReader);

此外,我已经查看了XmlReader.Create函数,但MSDN上说:“通过Create方法创建的读取器会扩展所有实体”。

我该如何创建一个不扩展实体的XmlReader,或者拥有未扩展实体的XDocument?

2个回答

5
以下方法对我有用。关键在于使用反射设置内部属性DisableUndeclaredEntityCheck的值。
XmlDocument document = new XmlDocument();
XmlReaderSettings readerSettings = new XmlReaderSettings()
{
    DtdProcessing = DtdProcessing.Ignore,
    IgnoreWhitespace = true,
};
using (XmlReader reader = XmlReader.Create(inputPath, readerSettings))
{
    PropertyInfo propertyInfo = reader.GetType().GetProperty("DisableUndeclaredEntityCheck", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
    propertyInfo.SetValue(reader, true);
    document.Load(reader);
}

-3

decasteljau! 有趣的是,我在搜索如何解决我的问题时发现了您的帖子。 我的问题与实体根本未被解决的情况有关。 所以谢谢您为我的问题提供答案。 以下是对您的问题的答案:请使用XmlDocument。

XDocument document = XDocument.Load("test.xml"); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; using (XmlWriter writer = XmlWriter.Create(Console.Out, settings)) { document.WriteTo(writer); } Console.WriteLine();


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接