2010-09-28 52 views
0

我在找XmlReader以外的東西。查詢xml文件而不將其加載到內存中?

我想應用查詢並只加載所需的數據。

其實我想加載儘可能少的xml。

也許某種XQuery實用程序/類可以做到這一點。

+2

URM,XMLReader不能加載數據需要,在某種意義上說,與XmlDocument不同,它在任何時候都不會在內存中保持完整狀態,在讀取它時只會保持足夠的狀態以知道它在哪裏。但是要真正找到XML的正確部分,您需要閱讀其中的一部分,否則,您可能只需編寫一個骯髒的正則表達式並對其進行解析即可。 – tyranid 2010-09-28 22:14:50

回答

3

您可以將XmlReader與LINQ to XML混合以獲得兩全其美的效果。訣竅是使用LINQ to XML將內部節點加載到內存中。

例如,假設你有一個具有以下結構的XML文件:

<log> 
    <logentry id="1"> 
    <date>...</date> 
    <source>...</source> 
    ... 
    </logentry> 
    ... 
</log> 

試想一下,有100萬個logentry元素,你想找到其中源元素包含特定字符串的元素。首先,寫出下面的方法:

Enumerable<LogEntry> ReadLogEntries (XmlReader r) 
{ 
    r.ReadStartElement ("log"); 
    while (r.Name == "logentry") 
    { 
    XElement logEntry = (XElement) XNode.ReadFrom (r); 
    yield return new LogEntry 
    { 
     ID = (int) logEntry.Attribute ("id"), 
     Date = (DateTime) logEntry.Element ("date"), 
     Source = (string) logEntry.Element ("source") 
    } 
    } 
    r.ReadEndElement(); 
} 

class LogEntry 
{ 
    public int ID; 
    public DateTime Date; 
    public string Source; 
} 

然後你就可以查詢XML文件(不加載所有到內存)如下:

它不
from l in ReadLogEntries (reader) 
where l.Source.Contains ("foo") 
select new { l.ID, l.Date } 
+1

+1非常酷,產生值將意味着.net會創建一個枚舉器和查詢將是懶惰的權利?所以如果foo是第二個元素,它只會加載2個元素!? – gideon 2011-01-11 16:14:53

+0

我很好奇吉迪恩問題的答案。 @Joe Albahari你能迴應嗎? – Freestyle076 2015-05-19 20:12:15

+0

正確。查詢是懶惰的。 – 2015-05-20 02:13:50

相關問題