我想知道是否有一种简单的方法可以在rails中解析XML文档而无需将其全部加载到ram中。
我一直在使用(取决于XML)Nokogiri和标准Hash.from_xml的组合来获取XML的内容。
当我处理(试图导入)100甚至1000种产品时,这一切都很好。然而,当XML文档中有16,000或40,000个产品时....我的Dino开始真正感受到它。
所以我想知道是否有办法在不将内存全部存入内存的情况下使用XML。
抱歉,我没有代码....我试图避免写任何新内容。我的意思是谁想编写自己的XML解析器呃?
答案 0 :(得分: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兆字节的文件中运行时,我看到了我的内存负载。它完成了我的目标。我很乐意看到其他答案。也许更轻松的东西。
答案 1 :(得分:0)
因为XML是分层的,解析器需要知道整个结构才能正确解析它。您可以将格式良好的片段提供给Nokogiri::HTML::Document.parse
,但您需要以其他方式获取这些片段。
我们假设您有一个巨大的xml文档:
<products>
<product>stuff</product>
<product>...</product>
... and so on
</products>
实际产品被封装在<products>
内,剥离信封部分,然后使用字符串拆分来获取每个<product>
及其内容的数组。然后将每个解析为XML片段。只是一个想法。
这可能有所帮助,虽然我从未使用它:https://github.com/soulcutter/saxerator