【发布时间】:2013-09-03 18:42:08
【问题描述】:
我从 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 并将流直接写入文件系统?要存储的文件可能非常大,以至于不可能总是将整个流加载到内存中并在那里格式化。
【问题讨论】:
-
要么您需要创建足够多的 XML 解析器来执行格式化(这是个坏主意)。或者,您需要解析 XML(例如,通过
XmlReader)足以输入到最小 XSLT 转换中,该转换在<xsl:output>元素中包含indent="yes"。 (第三种选择是自定义XmlWriter来实现它...不像第一种选择那么难,但如果您知道 XSTL,则比 XSLT 更难。注意。任何涉及到内存的完整 500MB XML 文件的选项最好有足够的要运行的内存! -
附加:为什么要格式化。 500MB XML 太大,无法以任何有用的方式手动处理。
-
@Richard 我只是想格式化它,因为它将为需要验证通过 Web 服务发送的数据类型的人提供更好的可读性。对于自动化处理,无需这样做。
-
原来我忘了
XmlWriterSettings.Indent...