【问题标题】:merge xml files in C#在 C# 中合并 xml 文件
【发布时间】:2012-09-28 22:18:18
【问题描述】:

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

例如。

目标 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>

每个源xml文件都需要在&lt;customer ...&gt;&lt;/customer&gt;之间插入

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

有什么建议吗?

【问题讨论】:

  • 每个源文件有多大? 2G?
  • 除了跳过 XML 声明之外,您是否需要对文件进行 任何 实际处理?是不是只是加了前缀和后缀的情况,剩下的只是抄袭?
  • @Cuong Le:是的,有时甚至更大(可以改变——我无法控制)
  • @Jon Skeet:只需要合并所有源文件(并跳过 xml 声明)并添加 就是这样;-)

标签: c# xml merge


【解决方案1】:

听起来在这种特殊情况下,假设所有文件都真正使用 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 是惰性的 - 这不会将源文件完全读入内存;它会一次读取一行。

rely 依赖于每个以 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);

【讨论】:

  • 我很困惑,客户标签是如何进入输出的?
  • @Jodrell:你把它放在“前缀”部分......我会用一个例子来编辑。
  • 啊,我现在明白了。我更喜欢简单的阅读器链接我正在准备。
  • @Jon Skeet:抱歉我的回复迟了。我一直很忙。很好的解决方案。为我工作。
猜你喜欢
  • 1970-01-01
  • 2021-04-29
  • 2010-09-25
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
相关资源
最近更新 更多