我从网络服务请求一个非常大(> 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并将流直接写入文件系统?要存储的文件可能非常大,以至于无法始终将整个流加载到内存中并在那里进行格式化。
答案 0 :(得分: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);
}
}
}