2009-09-10 21 views
6

Tôi có một số tệp XML khá lớn đại diện cho dữ liệu được xuất từ ​​một hệ thống sẽ được nhà cung cấp bên thứ ba sử dụng. Tôi đã cắt các kết quả ở 2.500 bản ghi cho mỗi tệp XML vì các tệp trở nên lớn và không thể quản lý được. Tuy nhiên, nhà cung cấp bên thứ 3 đã yêu cầu tôi kết hợp tất cả các tệp XML này thành một tệp duy nhất. Có 78 trong số các tệp XML này và chúng có tổng kích thước hơn 700MB! Crazy, tôi biết ... vậy làm thế nào bạn sẽ đi về việc kết hợp các tập tin này để chứa các nhà cung cấp bằng cách sử dụng C#? Hy vọng rằng có một cách thực sự hiệu quả để thực hiện điều này mà không cần đọc trong tất cả các tệp cùng một lúc bằng cách sử dụng LINQ :-)Cách hiệu quả nhất trong C# để hợp nhất nhiều hơn 2 tệp xml với cùng một lược đồ với nhau?

Trả lời

4

Tôi sẽ đi ra ngoài chi tiết ở đây và giả sử rằng xml của bạn trông giống như:

Nếu trường hợp đó xảy ra, tôi sẽ mở một luồng tệp và viết phần <records>, sau đó mở tuần tự từng tệp XML và ghi tất cả các dòng (trừ đĩa đầu tiên và cuối cùng) vào đĩa. Bằng cách đó bạn không có chuỗi lớn trong bộ nhớ và tất cả nên rất, rất nhanh để mã và chạy.

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

Đây sẽ là cách nhanh nhất, nhưng đó là một chút 'hacky'. –

+0

Đồng ý, 'hacky' tốt nhất: p DataSet.Merge có vẻ thanh lịch hơn nhiều, nhưng tôi không biết làm thế nào hiệu quả bộ nhớ sẽ được. – JustLoren

+0

Tôi có lược đồ được nhúng vào mỗi tệp XML, vì vậy điều này sẽ thậm chí còn nhiều hơn 'hacky' –

2

Sử dụng DataSet.ReadXml(), DataSet.Merge(), và DataSet.WriteXml(). Hãy để khung làm công việc cho bạn.
Something như thế này:

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

Đối với mô tả thêm và các ví dụ, hãy nhìn vào this article từ Microsoft.

+0

Đây là tuyến đường ban đầu tôi đã đi. Vấn đề là quá trình này đã kết thúc bằng cách sử dụng một bộ nhớ RAM! –

Các vấn đề liên quan