【问题标题】:How to resolve System.OutOfMemoryException when loading large XML file加载大型 XML 文件时如何解决 System.OutOfMemoryException
【发布时间】:2011-04-05 01:31:46
【问题描述】:

我的程序中有这段代码,它实际上加载了 500 MB 及以上的文件。

XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(reader);
reader.Close();

我收到此类错误,不知道如何解决问题。请给我一些建议。

【问题讨论】:

  • 您可能需要切换到基于流的 XML 解析器。
  • 和/或切换到实际加载较小的 XML 文件。
  • @Matt 你能告诉我一些如何做到这一点的代码吗?

标签: c# .net xml winforms


【解决方案1】:

我会使用XmlReader 来解析文档,只提供对数据的前向访问并在内存中很好地清理自身——当然,如果没有XmlDocument 类的便利,它可能会复杂得多。

这个简单的示例将从开始逐行读取文件开始,为每一行提供一个 XmlReader。

using (var rdr = XmlReader.Create(new StreamReader("File.xml")))
{
    while (rdr.Read())
    {
        //do what you will with the line
    }
}

XmlReader Properties (MSDN)查看使用 XmlReader 时可用的方法和属性

【讨论】:

  • 除了上述代码之外,我还有以下代码: XmlTextReader myTextReader = new XmlTextReader(txtFileName.Text); myTextReader.WhitespaceHandling = WhitespaceHandling.None; while (myTextReader.Read()) { foreach (xmlDoc 中的 XmlNode 节点) { TreeNode treeNode = XmlNode2TreeNode(myTextReader, myTextReader.p); treeNode.Text = FormatName(node); treeView1.Nodes.Add(treeNode); } }
  • 添加了基本示例来回答,mingzcky。
【解决方案2】:

您需要类似 SAX 的东西,但对于 .NET。

http://sourceforge.net/projects/saxdotnet/ 或 XmlReader,基本上是基于流的解析器。

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 2014-02-11
    相关资源
    最近更新 更多