是否有更有效的方法使用LINQ读取XML字段?

时间:2016-06-21 16:25:21

标签: c# linq

将来我将阅读200,000个xml文件,并从每个文件中捕获一些信息。我需要找到一种尽快获得的方法......

我的XML:

/

我想获得<note> <fields> <name>john</name> <lastname>doe</lastname> </fields> <info> <chNFe>VALUE</chNFe> </info> </note> 节点的值

chNFe

是否有更有效的方法使用LINQ读取XML字段?

2 个答案:

答案 0 :(得分:2)

通过XName搜索后代节点会稍微快一些:

var chave = doc.Descendants("chNFe").First().Value;

更新:直接抓取元素的速度要快一点:

var chave = doc.Root.Element("info").Element("chNFe").Value;

但是,您的程序花费的绝大部分时间都是从磁盘读取并解析XML文档,因此只要您使用LINQ to XML,就可能不会获得明显的收益。 / p>

Here's我的基准代码。以下是结果:

enter image description here

答案 1 :(得分:0)

你所拥有的是相当快的,但明确地向下钻取树似乎更快。

var doc = XDocument.Parse(xml);
var chave = doc.Root.Element("info").Element("chNFe").Value;

使用XPath查询可能是一种维持相同性能但简化代码的方法:

var doc = XDocument.Parse(xml);
var chave = doc.XPathSelectElement("/note/info/chNFe").Value;

此外,您可能不必单独阅读文件内容而不解析文件内容;使用XDocument.Load提供文件的路径并让它进行读取。

我的测试结果(每次测试1,000,000次,平均时间):

1. LINQ -> Descendants() = 0.000019ms
2. XPath                 = 0.000024ms
3. LINQ -> Element()     = 0.000004ms