如何格式化Xml流以写入文件

  • 本文关键字:文件 格式化 Xml xml stream
  • 更新时间 :
  • 英文 :


我从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);
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新