【问题标题】:Ruby/Rails parse XML without loading it all into memoryRuby/Rails 解析 XML 而不将其全部加载到内存中
【发布时间】:2013-11-21 08:49:15
【问题描述】:

我想知道是否有一种简单的方法可以在 Rails 中解析 XML 文档而不将其全部加载到 ram 中。
我一直在使用(取决于 XML)Nokogiri 和标准 Hash.from_xml 的组合来获取 XML 的内容。
当我处理(尝试进口)100 甚至 1000 种产品时,这一切都很好。然而,当 XML 文档中包含 16,000 或 40,000 个产品时......好吧,我的 Dino 开始真正感受到它。

所以我想知道是否有一种方法可以在不将其全部放入内存的情况下遍历 XML。

对不起,我没有代码……我试图避免写任何新东西。我的意思是谁想编写自己的 XML 解析器,嗯?

【问题讨论】:

    标签: ruby-on-rails xml xml-parsing


    【解决方案1】:

    我来到这里...

    reader = Nokogiri::JSON::Reader(File.open('test.xml'))
    
    reader.each do |node|
      if(node.name == 'Product')
        hash = Hash.from_xml(node.outer_xml).values.first
        break;
      end
    end
    

    当我在一个 60 兆的文件上运行它时,我观察了我的内存负载。它实现了我的目标。我很想看到其他答案。也许更轻一些。

    【讨论】:

      【解决方案2】:

      因为 XML 是分层的,解析器需要知道整个结构才能正确解析它。您可以将格式良好的片段提供给Nokogiri::HTML::Document.parse,但您需要通过其他方式将这些片段取出。

      假设您有一个巨大的 xml 文档:

      <products>
        <product>stuff</product>
        <product>...</product>
        ... and so on
      </products>
      

      实际产品封装在&lt;products&gt;内,去掉封装部分,然后使用字符串拆分得到每个&lt;product&gt;及其内容的数组。然后将其中的每一个解析为 XML 片段。只是一个想法。

      这可能会有所帮助,尽管我从未使用过它:https://github.com/soulcutter/saxerator

      【讨论】:

        猜你喜欢
        • 2013-01-08
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-14
        • 2023-03-21
        相关资源
        最近更新 更多