查询xml文件而不将其加载到内存中?

时间:2010-09-28 21:51:31

标签: .net linq linq-to-xml

我正在寻找XmlReader以外的东西。

我想应用查询并仅加载所需的数据。

实际上我想加载尽可能少的xml。

也许某种XQuery实用程序/类可以解决问题。

1 个答案:

答案 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 }