我从web服务获得数据,每页100 <row>
。我的脚本将这些页面连接到Nokogiri::XML::节点集。通过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]
问题:下面的代码运行大约10秒。对于未合并的节点集,这可以在眨眼之间完成:
(1..500).to_a.sample(100).each do |sample|
rows.at('//row[./NUMBER="%d"]' % sample)
end
有人有一个更好的方法来合并节点集或合并文档的解决方案吗?
我希望只保留一个节点集的行为,因为这些数据实际上是一个大节点集,由于技术原因被web服务分割。
合并节点集的关键是使用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