【问题标题】:How do I sort a Nokogiri NodeSet?如何对 Nokogiri 节点集进行排序?
【发布时间】:2013-03-21 21:22:23
【问题描述】:

我正在使用 Nokogiri 中的 XPath 解析从 Google 联系人 API 返回的 XML。

def getcontact
  doc = Nokogiri::XML.parse(open(url))
  doc.xpath('//xmlns:feed/xmlns:entry[xmlns:title[node()]]')
end

我的控制器是:

def index
  @mycontacts = getcontact.to_a.paginate(:page => params[:page], :per_page => 30)
end

我的看法是:

<% @mycontacts.each do |c| %>
  <p> Name: <%= c.xpath('xmlns:title').text %>  Email: <%= c.xpath('gd:email/@address').text %></p>
<% end %>

<%= will_paginate @mycontacts %>

我想按标题按字母顺序排序,我想知道如何去做。我读过我可以使用sort_by,但是如何从数组中选择标题?

【问题讨论】:

    标签: ruby-on-rails ruby xml-parsing nokogiri


    【解决方案1】:

    以下应该可以工作

    @mycontacts.sort!{|a, b| a.xpath('xmlns:title').text <=> b.xpath('xmlns:title').text}
    

    该块告诉它根据每个对象的 .xpath('xmlns:title').text 进行比较。

    【讨论】:

    • 非常感谢,请您解释一下这是如何工作的,以便我可以在不同的情况下再次使用
    • 在做什么?这是比较吗?
    • 您传递一个块,其中 a,b 是数组中的任意两个对象,而 是您希望比较数组中的任意两个对象的方式,所以是的是比较。因此,例如,假设我得到了一组对象,并且希望按它们的“收入”减去它们的“成本”对它们进行排序,我会这样做 @objects.sort!{|a,b| (a.revenue - a.cost) (b.revenue - b.cost)} 这将返回一个按利润排序的数组。
    • 使用sort,而不是sort_by,会浪费CPU时间。 sort_by 使用“Schwartzian Transform”,当您必须查看内部数据或计算某些内容以进行排序时,这非常有用。对于这个问题,两者都是正确的。相反,请使用sort_by{ |a| a.xpath('xmlns:title').text }
    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2016-06-02
    • 2022-08-17
    • 1970-01-01
    相关资源
    最近更新 更多