将大型xml文件拆分为子文件而不会造成内存争用

时间:2012-08-04 05:42:22

标签: c# xml

我有一个类似XML的

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

现在,在不带整体的情况下,在单独的文件中编写每个作业节点的最佳方法是什么 使用xmlreader和xmlwriter或其他任何选项将文件存入内存?

3 个答案:

答案 0 :(得分:3)

  1. 为输入文件创建一个XmlReader。
  2. 将读者放在第一个工作元素上。
  3. 使用ReadSubtree Method创建子树XmlReader。
  4. 为输出文件创建XmlWriter。
  5. 使用WriteNode Method将子树XmlReader的内容复制到XmlWriter中。
  6. 将原始阅读器放在下一个作业元素上,与第一个作业元素一样继续 如果没有更多的工作要素可以阅读。

答案 1 :(得分:2)

XSLT 3.0和流媒体的早期阶段,但以下XSLT 3.0样式表应该在Saxon-EE 9.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>

答案 2 :(得分:0)

如果数据确实看起来与您描述的完全一致(包括空格),那么最好的选择是使用StreamReader。它有一种读取到当前行末尾的方法。你读到行直到</job>。然后冲洗该工作并重复。

另外,我认为XmlReader不是一个糟糕的选择。