1

我想合并一些 xml 文件。目标 xml 与源文件略有不同。目标文件包含一个附加的根元素。

例如。

目标xml:

<?xml version="1.0" encoding="utf-8"?>
<customer ID="A0001" name="customername">
.....
.....
</customer>


源代码:

<?xml version="1.0" encoding="utf-8"?>
<order number="00001">
    <.....>
    <.....>
    <.....>
</order>

每个源 xml 文件都需要在<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() 的大文件内存不足。

有什么建议吗?

4

1 回答 1

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

于 2012-10-08T16:41:14.800 回答