簡體   English   中英

有沒有使用LINQ讀取XML字段的更有效方法?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM