【问题标题】:Splitting large xml files in to sub files without memory contention将大型 xml 文件拆分为子文件而不会发生内存争用
【发布时间】:2012-08-27 13:34:35
【问题描述】:

我有一个像下面这样的 XML

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

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

【问题讨论】:

    标签: c# xml


    【解决方案1】:
    1. 为输入文件创建一个 XmlReader。
    2. 将阅读器放在第一个作业元素上。
    3. 使用ReadSubtree Method 创建一个子树 XmlReader。
    4. 为输出文件创建一个 XmlWriter。
    5. 使用WriteNode Method将子树XmlReader的内容复制到XmlWriter中。
    6. 将原始阅读器放在下一个作业元素上,然后像第一个作业元素一样继续。
      如果没有更多要阅读的工作元素,请中断。

    【讨论】:

      【解决方案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>
      

      【讨论】:

        【解决方案3】:

        如果数据确实与您描述的完全一样(包括空格),那么最好的选择是使用 StreamReader。它有一个读取到当前行末尾的方法。您阅读行,直到到达&lt;/job&gt;。然后刷新该作业并重复。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多