回答
您可以將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非常酷,產生值將意味着.net會創建一個枚舉器和查詢將是懶惰的權利?所以如果foo是第二個元素,它只會加載2個元素!? – gideon 2011-01-11 16:14:53
我很好奇吉迪恩問題的答案。 @Joe Albahari你能迴應嗎? – Freestyle076 2015-05-19 20:12:15
正確。查詢是懶惰的。 – 2015-05-20 02:13:50
- 1. 將xml文件加載到內存中
- 2. 反序列化XML文件而不將其全部加載到內存中
- 3. 讀取xml文件並將其內容加載到數組中
- 4. 將文本文件加載到內存並分析其內容
- 5. 將XML加載到內存中
- 6. 加載XML到內存中
- 7. 合併大文件而不將整個文件加載到內存中?
- 8. 如何查詢不具有特定關聯的所有記錄而不將其全部加載到內存中?
- 9. 將雲存儲中的csv文件加載到大查詢
- 10. 如何將XML文件加載到大查詢
- 11. 如何在Rebol中複製文件而不將它們加載到內存中?
- 12. 將XML加載到內存流
- 13. 如何讀取大型XML文件,而無需將其加載到內存中並使用XElement
- 14. 將文件直接寫入TcpClient而不將其存儲到內存中
- 15. 通過http POST發送os.Stdin而不將文件加載到內存中
- 16. Ruby/Rails解析XML而不將它全部加載到內存中
- 17. 將整個XML文件載入內存
- 18. 我可以加速將xml bz2文件加載到內存中嗎?
- 19. 調整UIImage的大小而不將其完全加載到內存中?
- 20. 在內存中壓縮XML文件並將其上傳到azure文件存儲
- 21. 將u-Boot加載到內存中而不是閃爍
- 22. Java 8/NIO中的任何機制用於替換大文件的行而不將其加載到內存中?
- 23. 如何讀取文件,而不將其加載到內存中,如D中的Delphi TFileStream類?
- 24. 從zip壓縮文件中提取壓縮文件而不將整個文件加載到內存中
- 25. Ruby:顯示內存中的HTML文件而不將其保存到磁盤
- 26. 將txt的文件加載到Java應用程序中並將其保存到XML文件中
- 27. 複製blob而不將其下載到本地內存
- 28. 將php/mysql查詢中的數據添加到XML文件中
- 29. 寫入部分文件,而無需加載到內存中
- 30. Spring Jaxb2:如何將批處理數據追加到XML文件中而不將它讀到內存中?
URM,XMLReader不能加載數據需要,在某種意義上說,與XmlDocument不同,它在任何時候都不會在內存中保持完整狀態,在讀取它時只會保持足夠的狀態以知道它在哪裏。但是要真正找到XML的正確部分,您需要閱讀其中的一部分,否則,您可能只需編寫一個骯髒的正則表達式並對其進行解析即可。 – tyranid 2010-09-28 22:14:50