在C#中将多个2 xml文件与同一模式合并在一起的最有效方法是什么?

时间:2009-09-10 14:38:06

标签: c# xml

我有几个相当大的XML文件,它们代表从第三方供应商使用的系统导出的数据。我在每个XML文件的2,500条记录中砍掉结果,因为文件变得庞大而且难以管理。但是,第三方供应商要求我将所有这些XML文件合并到一个文件中。这些XML文件有78个,总大小超过700MB!疯了,我知道......那么你将如何组合这些文件来使用C#来容纳供应商?希望有一种真正有效的方法可以在不使用LINQ一次读取所有文件的情况下执行此操作: - )

2 个答案:

答案 0 :(得分: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>");
}

答案 1 :(得分: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);
  }

有关详细说明和示例,请查看Microsoft的this article