0

Web サービスから非常に大きな (>500mb) xml ファイルを要求し、その内容を .xml ファイルにResponseStream直接書き込みFileStreamます。しかし、結果のxmlファイルを開くと、内容は次のようになります。

<Changes requestChangeTrackingId="-1" resultChangeTrackingId="2387">
<Selectors>
<Selector selectorId="1"><DateValidFrom>2000-01-01T00:00:00</DateValidFrom><DateValidTo>2099-12-31T00:00:00</DateValidTo><Code20Z>01A</Code20Z><CodeNUM/><CodeENT>1</CodeENT><ShortName>01A</ShortName></Selector>
<Selector selectorId="2"><DateValidFrom>2000-01-01T00:00:00</DateValidFrom><DateValidTo>2099-12-31T00:00:00</DateValidTo><Code20Z>01B</Code20Z><CodeNUM/><CodeENT>2</CodeENT><ShortName>01B</ShortName></Selector>

次のようにストリームをフォーマットするにはどうすればよいですか。

<Changes requestChangeTrackingId="-1" resultChangeTrackingId="2387">
<Selectors>
<Selector selectorId="1">
   <DateValidFrom>2000-01-01T00:00:00</DateValidFrom>
   <DateValidTo>2099-12-31T00:00:00</DateValidTo>
   <Code20Z>01A</Code20Z>
   <CodeNUM/>
   <CodeENT>1</CodeENT>
   <ShortName>01A</ShortName>
</Selector>
[...]

ファイル全体をメモリにロードできないため、次のようなソリューションを使用できません

XDocument.Load( responseStream ).Save( "somefile.xml" );

ストリームをある種の XmlStreamFormatter に渡し、ストリームをファイルシステムに直接書き込む方法はありますか? 保存するファイルは非常に大きくなる可能性があるため、常にストリーム全体をメモリにロードしてフォーマットすることはできません。

4

1 に答える 1

1

XmlWriterSettings.Indentはここでメカニズムのコアを提供するため、コンテンツ全体をロードする必要がないことを確認することが重要です (ただし、実行中のパフォーマンス カウンターで慎重にテストすることをお勧めします。1 つのコンポーネントだけでも、データを読み込むのに熱心すぎるため、大きなエラーが発生する可能性があります)。アドレス空間とコミットの使用. したがって、データ サイズが 500MB 程度の場合、これは x64 のみでビルドされ、AnyCPU ビルドではありません。

次のようなものです:

void FormatXmlToFile(FileStream input, string outputFile) {
    using (var output = new FileStream(outputFile, FileMode.CreateNew)) {
        var reader = XmlReader.Create(input);
        var writerSettings = new XmlWriterSettings {
            Indent = true
        };

        using (var writer = XmlWriter.Create(output, writerSettings)) {
            writer.WriteNode(reader, true);
        }
    }
}
于 2013-09-03T10:42:08.580 に答える