在没有内存争用的情况下将大型xml文件拆分为子文件
本文关键字:文件 xml 大型 拆分 情况下 内存 争用 | 更新日期: 2024-09-24 19:26:16
我有一个类似XML的
<Jobs>
<job>
....
</job>
<job>
....
</job>
....
</Jobs>
现在,最好的方法是将每个作业节点写入一个单独的文件中,而不将整个使用xmlreader和xmlwriter或任何其他选项将文件写入内存?
- 为输入文件创建XmlReader
- 将读取器放置在第一个作业元素上
- 使用ReadSubtree方法创建子树XmlReader
- 为输出文件创建XmlWriter
- 使用WriteNode方法将子树XmlReader的内容复制到XmlWriter中
- 将原始读卡器放置在下一个作业元素上,继续第一个作业元素
如果没有更多作业元素可读取,则中断
XSLT3.0和流还处于早期阶段,但以下XSLT3.0样式表应该可以在SaxonEE9.4:中完成工作
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode streamable="yes" on-no-match="shallow-copy">
<xsl:template match="job">
<xsl:result-document href="job{position()}.xml">
<xsl:next-match/>
</xsl:result-document>
</xsl:template>
</xsl:stylesheet>
如果数据确实与您描述的完全一样(包括空白),那么最好的选择是使用StreamReader。它有一个读取到当前行末尾的方法。你一直读到</job>
。然后刷新该作业并重复。
此外,我不认为XmlReader是一个糟糕的选择。