9

我正在尝试在不扩展实体的情况下读取 XML 文档,对其进行一些操作,然后像最初一样使用未扩展的实体重新保存它。

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

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

例外:对未声明实体“实体名称”的引用。

然后我尝试将 传递XmlTextReaderXDocument构造函数,但该EntityHandling属性没有“无扩展”:

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

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

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

4

2 回答 2

5

以下对我有用。关键是使用反射来设置内部属性的值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);
}
于 2014-04-01T13:45:34.180 回答
-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();

于 2010-10-02T11:29:44.837 回答