Запросить XML-файл, не загружая его в память? - PullRequest
0 голосов
/ 29 сентября 2010

Я ищу что-то кроме XmlReader.

Я хочу применить запрос и загрузить только те данные, которые необходимы.

На самом деле я хочу загрузить как можно меньше xml.

Может быть, какая-то утилита / класс XQuery подойдет.

1 Ответ

3 голосов
/ 29 сентября 2010

Вы можете смешать 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 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...