Вы можете смешать XmlReader с LINQ to XML, чтобы получить лучшее из обоих миров. Хитрость заключается в том, чтобы использовать LINQ to XML для загрузки в память только внутренних узлов.
Например, предположим, у вас есть файл XML со следующей структурой:
<log>
<logentry id="1">
<date>...</date>
<source>...</source>
...
</logentry>
...
</log>
Представьте, что существует миллион элементов 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 }