Как найти текст в XML и отобразить его с помощью Nokogiri? - PullRequest
4 голосов
/ 11 марта 2012

У меня есть следующий XML, полученный из REST API:

<dataitems>
  <dataitem colour="null">
     <value>
        <label>Intel</label>
        <count>43</count>
     </value>
     <value>
        <label>AMD</label>
        <count>39</count>
     </value>
     <value>
        <label>ARM</label>
        <count>28</count>
     </value>
  </dataitem>
</dataitems>

Я хотел бы найти текст в теге <label> и отобразить соответствующее значение для <count> в таблице.

В контроллере у меня есть: @post_count = Nokogiri::XML(Post.item_data.to_xml).

В представлении я не уверен, нужно ли мне использовать @post_count.xpath или @post_count.search.

МожетКто-нибудь, пожалуйста, укажите мне правильное направление и правильный синтаксис для него?

Заранее спасибо.

1 Ответ

4 голосов
/ 11 марта 2012

Хотя я не уверен, какую информацию вы ищете, у меня есть несколько предложений.

1) Если вы знаете значение в элементе до того, как приступите к поиску:

doc = Nokogiri.XML(open(source_xml))

# Assuming there is only one of each label
node = doc.xpath('//label[text()="Intel"]').first
count = node.next_element.text

# or if there are many of each label
nodes = doc.xpath('//label[text()="Intel"]')
nodes.each {|node|
  count = node.next_element.text
  # do something with count here
}

2) Предполагая, что вы заранее не знаете имен в теге

doc = Nokogiri.XML(open(source_xml))
labels = {}
doc.xpath('//label').each {|node|
  labels[node.text] = node.next_element.text
}

# labels => {"Intel"=>"43", "AMD"=>"39", "ARM"=>"28"}

Мне лично больше нравится второе решение, потому что оно дает чистый хеш, но я предпочитаю работать с хешами и массивами как можно быстрее.

...