dec*_*jau 8 .net xml entity xmlreader linq-to-xml
我试图在不扩展实体的情况下读取XML文档,对其进行一些操作,并使用未扩展的实体重新保存它们.
直接使用XDocument时,无法加载,抛出异常告诉我它有未展开的实体:
XDocument doc = XDocument.Load(file); // <--- Exception
// ... do some manipulation to doc
doc.Save(file2);
Run Code Online (Sandbox Code Playgroud)
例外:引用未声明的实体'entityname'.
然后我试图传递XmlTextReader
给XDocument
构造函数,但该EntityHandling
属性没有"不扩展":
XmlTextReader xmlReader = new XmlTextReader(file));
xmlReader.EntityHandling = EntityHandling.ExpandCharEntities;
XDocument doc = XDocument.Load(xmlReader);
Run Code Online (Sandbox Code Playgroud)
另外,我查看了XmlReader.Create函数,但MSDN说:"Create方法创建的读者扩展了所有实体".
如何创建不扩展实体的XmlReader,或者具有未扩展实体的XDocument?
以下对我有用。关键是使用反射来设置内部属性的值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);
}
Run Code Online (Sandbox Code Playgroud)
小智 -3
德卡斯特耀!有趣的是,我发现你的帖子正在寻找如何解决我的问题。我的问题与实体根本没有解决的情况有关。所以谢谢你回答我的问题。以下是您问题的答案:请使用 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();
归档时间: |
|
查看次数: |
1854 次 |
最近记录: |