回答
您可以将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