2013-03-31 3 views
2

Я разбираю XML, возвращенный из API контактов Google, используя XPath в Nokogiri.Как сортировать Nokogiri NodeSet?

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, но как выбрать заголовок из массива?

ответ

3

Следующие должны работать

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

Блок говорит ему, чтобы сделать сравнение на основе .xpath («XMLNS: Название») текст для каждого объекта..

+0

отличное спасибо, не могли бы вы объяснить, как это работает, пожалуйста, чтобы я мог снова использовать, возможно, в другом сценарии – Richlewis

+0

Что такое <=>? это сравнение? – Richlewis

+0

Ваша передача блока, где a, b - любые два объекта в массиве, и <=> - это способ, который вы хотите для любых двух объектов в массиве, который будет сравниваться, так что да, это сравнение. Поэтому для экземпляров можно сказать, что я получил массив объектов, и я хотел сортировать их по их «доходу» за вычетом их «стоимости», я бы сделал @ objects.sort! {| A, b | (a.revenue - a.cost) <=> (b.revenue - b.cost)}, который возвращает массив, отсортированный по прибыли. – rovermicrover

Смежные вопросы