2012-01-24 153 views
1

我有以下结构读取大型XML文件

<main.....> 
<raw...> 
    <A>field 1</A> 
    <B>field 2</B> 
    .... 
    <interval> 
    <type>data</type> 
    <type>data</type> 
    </interval> 
    <interval> 
    <type>data</type> 
    <type>data</type> 
    </interval> 
    <interval2> 
    <acel>data i need</acel> 
    <decel>data i need</decel> 
    <left>data i need</left> 
    <right>data i need</right> 
    <range>tsw</range> 
    </interval2> 
    <interval2> 
    <acel>data i need</acel> 
    <decel>data i need</decel> 
    <left>data i need</left> 
    <right>data i need</right> 
    <range>xyz</range> 
    </interval2> 
</raw> 
... 
</raw> 
<raw> 
... 
</raw> 
</main> 

我需要的数据和时间间隔2儿童ACEL,减速,来氟米特,适合在主每一个原始节点,我不知道很多XML文件关于XML很多。我已经到了我得到A的地方,但没有更多。

+8

多大? 100MB? 1GB? 1TB?你能否将整个文件读入内存,你没有足够的内存来读取整个文件? – Servy

回答

1

在C#中最简单的办法 - 如果你正在使用.NET 3.5或更高版本 - 是使用LINQ到XML:

XDocument doc = XDocument.Load("file.xml"); 
var query = doc.Descendants("raw") 
       .Select(raw => new { 
          A = (string) raw.Element("A"), 
          Interval2 = raw.Element("interval2") 
              .Elements("type2") 
              .Select(type2 => (string) type2) 
              .ToList() 
         }); 

foreach (var item in query) 
{ 
    Console.WriteLine("A: {0}", item.A); 
    Console.WriteLine("Interval2 values:"); 
    foreach (var x in item.Interval2) 
    { 
     Console.WriteLine(" {0}", x); 
    } 
} 

当然这只是一个查询它的方式 - 这是很难给一个更具体的答案,没有关于你想要做什么的更多信息。

+0

我注意到LINQ to XML在解析非常大的XML文件(比如说200 KB或更多)时速度可能非常慢。但很简单! –

+0

@KevinR:200K *不是非常大 - 我绝对没有看到这种行为。任何参考? –

+0

哎呀!尝试16 MB(50万行)。看着错误的文件。我创建了一个每日空气污染数据的XML商店,需要花费很长时间才能解析,而我觉得这很慢。很多'TryParse'的枚举和可空的东西。 –

0

最简单的方法是使用XmlDocument。但是,这会将整个文件读入内存,因此不适用于非常大的文件。