【问题标题】:Prevent XmlTextReader from expanding entities防止 XmlTextReader 扩展实体
【发布时间】:2010-08-17 15:38:36
【问题描述】:

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

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

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

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

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

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

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

如何创建一个不展开实体的 XmlReader,或创建一个包含未展开实体的 XDocument?

【问题讨论】:

    标签: .net xml entity linq-to-xml xmlreader


    【解决方案1】:

    以下内容对我有用。关键是使用反射来设置内部属性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);
    }
    

    【讨论】:

      【解决方案2】:

      decasteljau! 有趣的是,我发现您的帖子正在搜索如何解决我的问题。我的问题与根本没有解决实体的情况有关。 所以谢谢你回答我的问题。以下是对您问题的回答:请使用 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();

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多