我正在寻找XmlReader以外的东西。
我想应用查询并仅加载所需的数据。
实际上我想加载尽可能少的xml。
也许某种XQuery实用程序/类可以解决问题。
答案 0 :(得分:3)
您可以将XmlReader与LINQ混合使用,以获得两全其美的效果。诀窍是使用LINQ to XML将内部节点加载到内存中。
例如,假设您有一个具有以下结构的XML文件:
<log>
<logentry id="1">
<date>...</date>
<source>...</source>
...
</logentry>
...
</log>
想象一下,有一百万个logentry元素,并且您想要找到source元素包含特定字符串的元素。首先,编写以下方法:
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 }