我目前正在抓取一些RSS提要并将项目收集到节点集中。这很好用,但是Nokogiri在某些物品上崩溃了。起初我认为我的OSX开发环境出了问题,所以安装了Debian服务器并得到了完全相同的错误。还尝试将 Ruby 从 1.9.3 降级到 1.9.2。
有什么建议吗?
一些代码:
doc.xpath("//item").remove
nodeset = doc.xpath("//item")
..
api_doc.xpath("//item").each do |node|
node = check_score(node)
unless node.nil?
nodeset << node
end
end
def check_score(node)
if node.xpath('website:attr[@name="imdbscore"]/@value').text.to_i > 6
return node
end
end
# sorting and finally add nodeset to doc.
崩溃日志在这里..
我认为删除所有//item
节点然后尝试找到它们是一种不好的做法。就在那里,我可以看到麻烦正在酝酿。
这将从文档中删除所有<item>
节点:
doc.xpath("//item").remove
这将尝试查找所有<item>
节点,这将返回一个空的 NodeSet:
nodeset = doc.xpath("//item")
您没有显示api_doc
来自哪里,但如果它是来自doc
的节点,尤其是在您删除节点之前,它的状态是可疑的,因为您可能有一些对已删除<item>
节点的悬而未决的引用。照原样,这会尝试遍历所有可能不存在的<item>
节点,因此可能会返回空的 NodeSet,或者更糟的是,可能会损坏:
api_doc.xpath("//item").each do |node|
node = check_score(node)
unless node.nil?
nodeset << node
end
end
我会检查你的Nokogiri和LibXML2的修订版,并确保它们是最新的。如果没有,请更新它们。我还会重新考虑在查找之前删除所有<item>
节点的逻辑。
如果您解释一下您要执行的操作,并分享一个 XML 的小示例,也许我们可以更好地帮助您。