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