XDocument.Load是否将所有数据加载到内存中?

时间:2017-03-11 07:44:10

标签: c# xml

我必须读取大型xml文件的根节点的所有第一级节点,如下所示:

<root>
 <record n="1"><a/><b/><c/></record>
 <record n="2"><a/><b/><c/></record>
 <record n="3"><a/><b/><c/></record>
</root>

我的代码如下:

var xml = XDocument.Load(filename);

var firstNode = xml?.Root?.Descendants()?.FirstOrDefault();

var elements = firstNode?.Elements();

我只需要获得root的第一个子节点以及它的所有第一级子节点。这段代码工作正常,但问题是:这样读是否安全?我猜它不会将所有数据加载到内存中 - 只有xml文件的结构?

我看到调试时内存没有增加。如果我实际上试图查看xml变量中的内容,它只会爆炸。

2 个答案:

答案 0 :(得分:3)

不,XDocument将整个文档加载到内存中。是否安全&#34;这样做与否取决于你需要处理的文件大小。

如果您需要处理不适合内存的XML文件,您可能希望使用XmlReader,遗憾的是,这很难使用。

答案 1 :(得分:1)

我使用xmlreader和xdocument的组合。更新了代码以动态获取第一个标记名称。

&#13;
&#13;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            reader.ReadStartElement(); //read root
            XElement.ReadFrom(reader);// read \n
            XElement record = null;
            string recordName = "";
            Boolean first = true;
            while (!reader.EOF)
            {
                if (first)
                {
                    record = (XElement)XElement.ReadFrom(reader);
                    first = false;
                    recordName = record.Name.LocalName;
                }
                else
                {
                    if (reader.Name != recordName)
                    {
                        reader.ReadToFollowing(recordName);
                    }
                    if (!reader.EOF)
                    {
                        record = (XElement)XElement.ReadFrom(reader);
                    }
                }
            }
        }
    }
}
&#13;
&#13;
&#13;