0

我从 Web 服务获取数据,<row>每页 100 个。我的脚本将这些页面连接到 Nokogiri::XML::Nodeset。通过 XPath 搜索节点集非常慢。

这段代码代替了web服务调用和xml解析,但是症状是一样的:

rows = []
(1..500).to_a.each_slice(100) { |slice|
  rows << Nokogiri::XML::Builder.new { |xml|
    xml.root {
      xml.rows {
        slice.each { |num|
          xml.row {
            xml.NUMBER {
              xml.text num
            }
          }
        }
      }
    }
  }.doc.at('/root/rows')
}

rows = rows.map { |a| a.children }.inject(:+)

生成的 NodeSet 包含来自五个文档的节点。这似乎是一个问题:

rows.map { |r| r.document.object_id }.uniq
  => [21430080, 21732480, 21901100, 38743080, 40472240]

问题:以下代码在大约十秒钟内运行。对于未合并的节点集,这是在眨眼之间完成的:

(1..500).to_a.sample(100).each do |sample|
  rows.at('//row[./NUMBER="%d"]' % sample)
end

有人有解决方案以更好的方式合并节点集或合并文档吗?

我想只保留一个节点集的行为,因为这个数据实际上是一个大节点集,由于技术原因被 Web 服务分割。

4

1 回答 1

0

合并节点集的关键是使用 Node#remove 分离节点并将它们添加到另一个节点集:

nodeset = nil
rows.each do |slice|
  if nodeset.nil?
    nodeset = slice
  else
    slice.children.each do |row|
      nodeset.add_child(row.remove)
    end
  end
end
于 2013-03-27T13:57:15.050 回答