首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止XmlTextReader扩展实体

防止XmlTextReader扩展实体
EN

Stack Overflow用户
提问于 2010-08-17 15:38:36
回答 2查看 2K关注 0票数 9

我试图在不展开实体的情况下读取XML文档,对其进行一些操作,并将其与最初的未展开实体一起重新保存。

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

代码语言:javascript
复制
XDocument doc = XDocument.Load(file);  // <--- Exception
// ... do some manipulation to doc
doc.Save(file2);

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

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

代码语言:javascript
复制
XmlTextReader xmlReader = new XmlTextReader(file));
xmlReader.EntityHandling = EntityHandling.ExpandCharEntities;
XDocument doc = XDocument.Load(xmlReader);

另外,我看过XmlReader.Create函数,但是MSDN说:“由Create方法创建的读取器扩展所有实体”。

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

EN

回答 2

Stack Overflow用户

发布于 2014-04-01 13:45:34

下面这句话对我很管用。关键是使用反射设置内部属性DisableUndeclaredEntityCheck的值。

代码语言:javascript
复制
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);
}
票数 5
EN

Stack Overflow用户

发布于 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();

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3504227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档