【问题标题】:Is there a way of iterating through a specific XML tag in Ruby?有没有办法在 Ruby 中遍历特定的 XML 标记?
【发布时间】:2015-01-26 22:18:18
【问题描述】:

是否可以在 Ruby 中迭代特定的 XML 标记?就我而言,我想在以下 XML 代码中迭代 desc 标记:

<desc>
     <id>2408</id>
     <who name="Joe Silva">joe@silva.com</who>
     <when>Today</when>
     <thetext>Hello World</thetext>
</desc>
<desc>
     <id>2409</id>
     <who name="Joe Silva2">joe2@silva.com</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 : joe@silva.com
bug_when : Today
thetext : Hello World 

commentid : 2409
name : Joe Silva2
who : joe2@silva.com
bug_when : Future
thetext : Hello World Again

有什么建议吗?

【问题讨论】:

标签: ruby-on-rails ruby xml nokogiri rexml


【解决方案1】:

包含 who 节点的 name 属性的 Nokogiri 示例:

require 'nokogiri'

doc = Nokogiri.XML '
<root>
  <desc>
     <id>2408</id>
     <who name="Joe Silva">joe@silva.com</who>
     <when>Today</when>
     <thetext>Hello World</thetext>
  </desc>
  <desc>
    <id>2409</id>
     <who name="Joe Silva2">joe2@silva.com</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

【讨论】:

  • 正是我想要的。谢谢! +1
【解决方案2】:

我还建议使用Nokogiri gem。像这样的东西应该可以工作:

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

【讨论】:

  • 使用doc.at('desc id') 代替doc.css('desc id').first。而不是xpath('//desc/id').first 使用at_xpath(...)
  • 太棒了,不知道那个。我已经更新了我的答案。
  • 感谢您的帮助! +1
猜你喜欢
  • 1970-01-01
  • 2019-10-14
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 2010-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多