0

我从 Web 服务请求一个非常大 (>500mb) 的 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此处提供了一种机制的核心,因此确保不需要加载整个内容(但绝对建议使用性能计数器进行仔细测试。仅一个组件过于急于读取数据可能会导致地址空间和提交使用。因此,对于大约 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 回答