在C#中合并xml文件

时间:2012-10-08 16:20:18

标签: c# xml merge

我想合并几个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>

之间插入每个源xml文件

源文件可能非常大(例如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()的大文件内存不足。

有什么建议吗?

1 个答案:

答案 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);