2015-01-26 3 views
1

Можно ли перебирать определенный тег XML в Ruby? В моем случае я хочу перебрать desc тег в следующем коде XML:Есть ли способ итерации через определенный тег XML в Ruby?

<desc> 
    <id>2408</id> 
    <who name="Joe Silva">[email protected]</who> 
    <when>Today</when> 
    <thetext>Hello World</thetext> 
</desc> 
<desc> 
    <id>2409</id> 
    <who name="Joe Silva2">[email protected]</who> 
    <when>Future</when> 
    <thetext>Hello World Again</thetext> 
</desc> 

До сих пор, вот код, я использую:

xml_doc = agent.get("www.somewhere.com/file.xml") 
document = REXML::Document.new(xml_doc.body); 

# iterate over desc here 

Я хочу перебрать каждый desc тегов, так что Я получаю следующий результат:

commentid : 2408 
name : Joe Silva 
who : [email protected] 
bug_when : Today 
thetext : Hello World 

commentid : 2409 
name : Joe Silva2 
who : [email protected] 
bug_when : Future 
thetext : Hello World Again 

Любые предложения?

+0

Как это * НЕ * дубликат http://stackoverflow.com/questions/28157224/как к GET-зе-атрибуты-в-в-XML-тегов, использующих-рубинового с-REXML? –

+0

Используйте XPath для перебора списка * *. –

ответ

2

пример Nokogiri, который включает в себя атрибут name для who узла:

require 'nokogiri' 

doc = Nokogiri.XML ' 
<root> 
    <desc> 
    <id>2408</id> 
    <who name="Joe Silva">[email protected]</who> 
    <when>Today</when> 
    <thetext>Hello World</thetext> 
    </desc> 
    <desc> 
    <id>2409</id> 
    <who name="Joe Silva2">[email protected]</who> 
    <when>Future</when> 
    <thetext>Hello World Again</thetext> 
    </desc> 
</root> 
' 

doc.css("desc").each do |desc| 
    puts "commentid : #{desc.css("id").text}" 
    puts "name : #{desc.css("who").attribute("name")}" 
    puts "who : #{desc.css("who").text}" 
    puts "bug_when : #{desc.css("when").text}" 
    puts "the text : #{desc.css("thetext").text}" 
end 
+0

Именно то, что я искал. Благодаря! +1 – Alias

2

Я также рекомендую использовать драгоценный камень Nokogiri. Нечто подобное должно работать:

require 'open-uri' 
require 'nokogiri' 

# fetch and parse the document 
doc = Nokogiri::HTML(open('www.somewhere.com/file.xml')) 

# search with css selectors 
puts doc.at('desc id').text 

# search by xpath 
puts doc.at_xpath('//desc/id').text 

# to iterate over a specific tag 
doc.css('desc').each do |tag| 
    puts tag.css('id').text 
    # ... 
end 
+1

Вместо 'doc.css ('desc id'). First' use' doc.at ('desc id') '. Вместо 'xpath ('// desc/id'). First' use' at_xpath (...) '. –

+0

Удивительный, не знал этого. Я обновил свой ответ. –

+0

Спасибо за помощь! +1 – Alias

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