2012-01-24 47 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。但是,這會將整個文件讀入內存,因此不適用於非常大的文件。