Какой самый эффективный способ в C # объединить более 2 файлов XML с одной и той же схемой? - PullRequest
6 голосов
/ 10 сентября 2009

У меня есть несколько довольно больших файлов XML, которые представляют данные, экспортированные из системы, которая будет использоваться сторонним поставщиком. Я разбил результаты на 2500 записей для каждого файла XML, потому что файлы становятся огромными и в противном случае неуправляемыми. Однако сторонний поставщик попросил меня объединить все эти файлы XML в один файл. Существует 78 таких XML-файлов, и их размер превышает 700 МБ! Сумасшедший, я знаю ... как бы вы объединили эти файлы, чтобы приспособить продавца к использованию C #? Надеемся, что есть действительно эффективный способ сделать это без чтения сразу всех файлов с помощью LINQ: -)

Ответы [ 2 ]

4 голосов
/ 10 сентября 2009

Я собираюсь выйти на конечность и предположить, что ваш 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>");
}
2 голосов
/ 10 сентября 2009

Используйте 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);
  }

Для дальнейшего описания и примеров, посмотрите на эту статью от Microsoft.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...