2009-09-10 40 views
6

我有幾個相當大的XML文件,表示從第三方供應商使用的系統導出的數據。我劈砍每個XML文件的2500條記錄的結果,因爲這些文件變得巨大而且不可管理。但是,第三方供應商要求我將所有這些XML文件合併到一個文件中。這些XML文件中有78個,它們的總大小超過700MB!瘋狂,我知道......那麼如何將這些文件結合起來以適應使用C#的供應商呢?希望有一個真正有效的方式來做到這一點,而不立刻使用LINQ :-)C#中最有效的方式是將多個具有相同模式的xml文件合併在一起?

回答

4

我要去這裏走出去的肢體,並假設你的XML看起來像中的所有文件的讀取:

<records> 
    <record> 
    <dataPoint1/> 
    <dataPoint2/> 
    </record> 
</records> 

如果是這樣,我會打開一個文件流並寫入<records>部分,然後順序打開每個XML文件並將所有行(第一個和最後一個除外)寫入磁盤。這樣你就不會在內存中產生巨大的字符串,並且它們都應該非常快速地進行編碼和運行。

public void ConsolidateFiles(List<String> files, string outputFile) 
{ 
    var output = new StreamWriter(File.Open(outputFile, FileMode.Create)); 
    output.WriteLine("<records>"); 
    foreach (var file in files) 
    { 
    var input = new StreamReader(File.Open(file, FileMode.Open)); 
    string line; 
    while (!input.EndOfStream) 
    { 
     line = input.ReadLine(); 
     if (!line.Contains("<records>") && 
      !line.Contains("</records>")) 
     { 
     output.Write(line); 
     } 
    } 
    } 
    output.WriteLine("</records>"); 
} 
+0

這將是最快的方式,但它有點'哈克'。 – 2009-09-10 14:48:29

+0

同意,'hacky'充其量:p DataSet.Merge似乎更加優雅,但我不知道如何將內存效率。 – JustLoren 2009-09-10 15:05:50

+0

我把模式烘焙到每個XML文件中,所以這會變得更加'hacky' – 2009-09-10 15:18:20

2

使用DataSet.ReadXml()DataSet.Merge()DataSet.WriteXml()。讓框架爲你做好工作。
事情是這樣的:

public void Merge(List<string> xmlFiles, string outputFileName) 
    { 
    DataSet complete = new DataSet(); 

    foreach (string xmlFile in xmlFiles) 
    { 
     XmlTextReader reader = new XmlTextReader(xmlFile); 
     DataSet current = new DataSet(); 
     current.ReadXml(reader); 
     complete.Merge(current); 
    } 

    complete.WriteXml(outputFileName); 
    } 

爲了進一步說明和示例,從微軟看一看this article

+0

這是我採取的原始路線。問題是這個過程最終使用了一段RAM! – 2009-09-10 15:17:30

相關問題