[英]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.