.net – 防止XmlTextReader扩展实体

前端之家收集整理的这篇文章主要介绍了.net – 防止XmlTextReader扩展实体前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图在不扩展实体的情况下读取 XML文档,对其进行一些操作,然后像最初那样使用未扩展的实体重新保存它.

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

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

Exception: Reference to undeclared entity ‘entityname’.

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

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

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

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

以下对我有用.关键是使用反射来设置内部属性 DisableUndeclaredEntityCheck的值.
  1. XmlDocument document = new XmlDocument();
  2. XmlReaderSettings readerSettings = new XmlReaderSettings()
  3. {
  4. DtdProcessing = DtdProcessing.Ignore,IgnoreWhitespace = true,};
  5. using (XmlReader reader = XmlReader.Create(inputPath,readerSettings))
  6. {
  7. PropertyInfo propertyInfo = reader.GetType().GetProperty("DisableUndeclaredEntityCheck",BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
  8. propertyInfo.SetValue(reader,true);
  9. document.Load(reader);
  10. }

猜你在找的XML相关文章