2015-01-26 72 views
1

是否可以在Ruby中迭代特定的XML标记?在我来说,我想遍历desc标签下面XML代码:在Ruby中是否有一种迭代遍历特定XML标记的方法?

<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 /如何到获得最属性-的-AN-XML标签的使用,红宝石与-REXML? – 2015-01-27 00:48:47

+0

使用XPath遍历*节点列表*。 – 2015-01-27 04:20:23

回答

2
,包括对 who节点 name属性

引入nokogiri例如:

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 2015-01-27 15:14:21

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')。首先使用'doc.at('desc id')'。而不是'xpath('// desc/id')。首先使用'at_xpath(...)'。 – 2015-01-27 00:55:24

+0

太棒了,不知道那个。我已经更新了我的答案。 – 2015-01-27 08:07:12

+0

感谢您的帮助! +1 – Alias 2015-01-27 15:14:42

相关问题