我从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中,并将流直接写入文件系统?要存储的文件可能太大,以至于不可能总是将整个流加载到内存中并在那里格式化。
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);
}
}
}