我必须读取大型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
变量中的内容,它只会爆炸。
答案 0 :(得分:3)
不,XDocument
将整个文档加载到内存中。是否安全&#34;这样做与否取决于你需要处理的文件大小。
如果您需要处理不适合内存的XML文件,您可能希望使用XmlReader
,遗憾的是,这很难使用。
答案 1 :(得分:1)
我使用xmlreader和xdocument的组合。更新了代码以动态获取第一个标记名称。
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;