防止XmlTextReader扩展实体

时间:2010-08-17 15:38:37

标签: .net xml entity linq-to-xml xmlreader

我试图在不扩展实体的情况下读取XML文档,对其进行一些操作,然后将它们与未扩展的实体一起重新保存。

直接使用XDocument时,无法加载,抛出异常告诉我它有未展开的实体:

XDocument doc = XDocument.Load(file);  // <--- Exception
// ... do some manipulation to doc
doc.Save(file2);
  

例外:引用未声明的实体'entityname'。

然后我尝试将XmlTextReader传递给XDocument构造函数,但EntityHandling属性没有“不展开”:

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

另外,我查看了XmlReader.Create函数,但MSDN说:“Create方法创建的读者扩展了所有实体”。

如何创建不扩展实体的XmlReader,或者创建未展开实体的XDocument?

2 个答案:

答案 0 :(得分:4)

以下对我有用。关键是使用反射来设置内部属性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);
}

答案 1 :(得分:-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();