Ruby,Nokogiri:按属性值排序节点集

时间:2012-11-30 09:34:27

标签: ruby-on-rails ruby nokogiri

我想按标题值对Nokigiri节点集进行排序。尝试以下代码,但排序不起作用:/任何建议?

doc.xpath("//item").sort{|x,y| x.xpath('foo:attr[@name="title"]/@value').text <=> y.xpath('foot:attr[@name="title"]/@value').text }

XML示例:

<item>
  <foo:attr name="title" value="a"/>
</item>
<item>
  <foot:attr name="title" value="c"/>
</item>
<item>
  <foor:attr name="title" value="b"/>
</item>

输出我正在寻找:(nodeset)

<item>
  <foo:attr name="title" value="a"/>
</item>
<item>
  <foot:attr name="title" value="b"/>
</item>
<item>
  <foor:attr name="title" value="c"/>
</item>

1 个答案:

答案 0 :(得分:4)

如果我理解你的请求,你想要删除它们,然后对数组进行排序,然后再添加它们:

xml = Nokogiri::XML.parse(data)
nodes = xml.root.css("item").remove
nodes.sort_by{ |node|
  node.css("attr")[0].attr("value"))
}.each{ |node|
  xml.root.add_child(node)
}