[英]Is there a more efficient method of reading XML fields with LINQ?
将来,我将读取200,000个xml文件,并从每个文件中捕获一些信息。 我需要找到一种方法来尽快获得...
我的XML:
<note>
<fields>
<name>john</name>
<lastname>doe</lastname>
</fields>
<info>
<chNFe>VALUE</chNFe>
</info>
</note>
我想获取chNFe
节点的值
string xml = File.ReadAllText(@"C:\myxml.xml");
Regex.Replace(xml, @"[^\u0000-\u007F]", string.Empty);
var doc = XDocument.Parse(xml);
var matchingElements = doc.Descendants().Where(x => x.Name.LocalName == "chNFe");
string chave = matchingElements.First().Value;
Console.WriteLine("Chave: " + chave);
有没有使用LINQ读取XML字段的更有效方法?
通过XName
搜索后代节点会稍微快一些:
var chave = doc.Descendants("chNFe").First().Value;
更新 :直接抓取元素仍然要快一点:
var chave = doc.Root.Element("info").Element("chNFe").Value;
但是,程序花费的大部分时间都将用于从磁盘读取和解析XML文档,因此,只要使用LINQ to XML,就可能不会获得明显的收益。
这是我的基准代码。 结果如下:
您拥有的东西相当快,但是显式地深入树中似乎更快。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.