在没有内存争用的情况下将大型xml文件拆分为子文件



我有一个类似XML的

<Jobs>
   <job>
   ....
   </job>
   <job>
   ....
   </job>
   ....
</Jobs>

现在,最好的方法是将每个作业节点写入一个单独的文件中,而不将整个使用xmlreader和xmlwriter或任何其他选项将文件写入内存?

  1. 为输入文件创建XmlReader
  2. 将读取器放置在第一个作业元素上
  3. 使用ReadSubtree方法创建子树XmlReader
  4. 为输出文件创建XmlWriter
  5. 使用WriteNode方法将子树XmlReader的内容复制到XmlWriter中
  6. 将原始读卡器放置在下一个作业元素上,继续第一个作业元素
    如果没有更多作业元素可读取,则中断

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是一个糟糕的选择。

最新更新