2009-09-10 11 views
6

Üçüncü taraf bir satıcı tarafından kullanılmak üzere bir sistemden aktarılan verileri temsil eden oldukça büyük miktarda XML dosyam var. Her XML dosyası için 2.500 kayıtta sonuçlar doğramaktaydım, çünkü dosyalar devasa ve yönetilemez hale geliyor. Ancak, üçüncü taraf satıcı, bu XML dosyalarının tümünü tek bir dosyada birleştirmemi istedi. Bu XML dosyalarının 78'i var ve bunların boyutu 700 MB'nin üzerinde! Çılgın, biliyorum ... Peki bu dosyaları C# kullanarak satıcıya uyum sağlamak için nasıl birleştirirdiniz? Umarım bir kez xml benzer şekilde olduğunu burada bir yargıda bulunmak ve kabul edeceğimAynı şema ile birlikte 2'den fazla xml dosyalarını birleştirmek için C# 'daki en etkili yol nedir?

cevap

4

LINQ :-) kullanmada tüm dosyaları içinde okumadan bunu yapmanın bir gerçek verimli bir yolu vardır:

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

Böyle bir durumda, bir dosya akışı açıp <records> bölümünü yazıp her XML dosyasını sırayla açıp tüm satırları (ilk ve sonuncu hariç) diske yazdım. Bu sayede hafızada büyük bir dizge yok ve kod yazıp çalıştırmak için çok hızlı olmalı.

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

Bu en hızlı yol olacak, ama biraz 'hacky'. –

+0

En iyi ihtimalle, 'hacky' kabul edildi: p DataSet.Merge çok daha zarif görünüyor, ancak ne kadar bellek verimli olacağını hiçbir fikrim yok. – JustLoren

+0

Her XML dosyasına yapılan şemaya sahibim, bu daha da fazla 'hacky' olurdu –

2
Kullanım DataSet.ReadXml()

, DataSet.Merge() ve DataSet.WriteXml(). Çerçevenin sizin için işi yapmasına izin verin. Böyle
şey: Daha fazla bilgi ve örnekler için

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); 
    } 

, Microsoft'tan this article bakabilirsiniz.

+0

Bu, aldığım orijinal yoldu. Sorun, sürecin bir gig RAM'i kullanarak sona ermesiydi! –

İlgili konular