1

いくつかの 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>

<customer ...>すべてのソース xml ファイルを と の間に挿入する必要があります。</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);
}

これは、出力ファイルを 3 回開くため、それほど効率的ではありませんが、できる限り簡単に記述しています。linesこれは遅延であることに注意してください。これは、ソース ファイルを完全にメモリに読み込むわけではありません。一度に 1 行ずつ読み取ります。

ただし、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 に答える