我想合并几个xml文件。 目标xml与源文件略有不同。目标文件包含一个aditional根元素。
例如。
目的地xml:
<?xml version="1.0" encoding="utf-8"?>
<customer ID="A0001" name="customername">
.....
.....
</customer>
来源xml:
<?xml version="1.0" encoding="utf-8"?>
<order number="00001">
<.....>
<.....>
<.....>
</order>
需要在<customer ...>
和</customer>
源文件可能非常大(例如2 Gb)。
我可以使用根元素编写目标xml文件,并使用XmlTextReader和
读取源文件string myOrder = textReader.ReadOuterXml();
writer.WriteRaw(myOrder );
结果(每个订单都是不同的xml文件)
<?xml version="1.0" encoding="utf-8"?>
<customer ID="A0001" name="customername">
<order number="00001">
<.....>
<.....>
<.....>
</order>
<order number="00002">
<.....>
<.....>
<.....>
</order>
<order number="00003">
<.....>
<.....>
<.....>
</order>
</customer>
但我担心使用ReadOuterXml()的大文件内存不足。
有什么建议吗?
答案 0 :(得分:2)
听起来在这种特殊情况下,假设所有文件都是真正使用UTF-8,你基本上可以作弊。 .NET 4使这一点变得特别容易:
public void MergeFiles(string outputPath, string prefix, string suffix,
IEnumerable<string> files)
{
File.WriteAllText(outputPath, prefix);
var lines = files.SelectMany(file => File.ReadLines(file).Skip(1));
File.AppendAllLines(outputPath, lines);
File.AppendAllText(outputPath, suffix);
}
这不是完全尽可能高效,因为它会打开输出文件三次 - 但它的写法就像我能做到的那样简单。请注意,这里的lines
是懒惰的 - 这个不会将源文件完全读入内存;它会一次读一行。
它依赖依赖在每个文件上以XML声明开头,但是在UTF-8中。您可以使用更强大的流媒体方法,但如果您对源格式有信心,这很简单...
编辑:样本用法:
string prefix = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n"
+ "<customer ID=\"A0001\" name=\"customername\">";
MergeFiles("output.xml", prefix, "</customer>", sourceFiles);