我试图在不展开实体的情况下读取XML文档,对其进行一些操作,并将其与最初的未展开实体一起重新保存。
当直接使用XDocument时,它无法加载,抛出一个异常告诉我它有未展开的实体:
XDocument doc = XDocument.Load(file); // <--- Exception
// ... do some manipulation to doc
doc.Save(file2);异常:引用未声明的实体“实体名称”。
然后,我尝试将XmlTextReader传递给XDocument构造函数,但是EntityHandling属性没有"no展开“:
XmlTextReader xmlReader = new XmlTextReader(file));
xmlReader.EntityHandling = EntityHandling.ExpandCharEntities;
XDocument doc = XDocument.Load(xmlReader);另外,我看过XmlReader.Create函数,但是MSDN说:“由Create方法创建的读取器扩展所有实体”。
如何创建不展开实体的XmlReader,或具有未展开实体的XDocument?
发布于 2014-04-01 13:45:34
下面这句话对我很管用。关键是使用反射设置内部属性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);
}发布于 2010-10-02 11:29:44
德士塔斯特拉索!有趣的是,我发现你的帖子在搜索如何解决我的问题。我的问题与实体根本无法解决的情况有关。所以谢谢你回答我的问题。以下是对您问题的回答:请使用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();
https://stackoverflow.com/questions/3504227
复制相似问题