2010-09-28 101 views
0

我在找XmlReader以外的东西。查询xml文件而不将其加载到内存中?

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

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

也许某种XQuery实用程序/类可以做到这一点。

+2

URM,XMLReader不能加载数据需要,在某种意义上说,与XmlDocument不同,它在任何时候都不会在内存中保持完整状态,在读取它时只会保持足够的状态以知道它在哪里。但是要真正找到XML的正确部分,您需要阅读其中的一部分,否则,您可能只需编写一个肮脏的正则表达式并对其进行解析即可。 – tyranid 2010-09-28 22:14:50

回答

3

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

+1非常酷,产生值将意味着.net会创建一个枚举器和查询将是懒惰的权利?所以如果foo是第二个元素,它只会加载2个元素!? – gideon 2011-01-11 16:14:53

+0

我很好奇吉迪恩问题的答案。 @Joe Albahari你能回应吗? – Freestyle076 2015-05-19 20:12:15

+0

正确。查询是懒惰的。 – 2015-05-20 02:13:50

相关问题