как разобрать повторяющиеся элементы с нокогири - PullRequest
2 голосов
/ 06 июня 2011

Я новичок в Nokogiri, так как мне разобрать «данные» и их текст, а также "имя" из "метода" в следующем XML:

<get_escalators_response status="200" status_text="OK">
<escalator id="6181e65d-8ba0-4937-9c44-8f2b10b0def7">
 <name>Team alert</name>
 <comment/>
 <in_use>1</in_use>
 <condition>
   Threat level at least
   <data>
     High
     <name>level</name>
   </data>
 </condition>
 <event>
   Task run status changed
   <data>
     Done
     <name>status</name>
   </data>
 </event>
 <method>
   Email
   <data>
     team@example.org
     <name>to_address</name>
   </data>
   <data>
     admin@example.org
     <name>from_address</name>
   </data>
   <data>
     0
     <name>notice</name>
   </data>
 </method>
</escalator>
...
</get_escalators_response>

Ответы [ 2 ]

1 голос
/ 06 июня 2011

Присвоив ваш XML переменной с именем xml, я бы поступил так:

require 'nokogiri'
require 'pp'

doc = Nokogiri::XML(xml)
pp doc.search('//method/data').map{ |n| n.text.scan(/\S+/) }

Обратите внимание, что возвращается массив массивов.Было бы легко привести данные в строки или хэши.

# >> [["team@example.org", "to_address"],
# >>  ["admin@example.org", "from_address"],
# >>  ["0", "notice"]]
0 голосов
/ 06 июня 2011

Есть несколько способов сделать это, вот один:

doc = Nokogiri::XML("your_xml_document")
doc.search("data").each do |data|
  name = data.search("name").remove # remove the name element from data element
  name_text = name.text
  data_text = data.text
  # do stuff with text
end

Вы можете искать определенные вложенные элементы, например:

doc.search("method > data").each do |data|
  # do stuff
end
...