如何使用Nokogiri从XML获取属性/选项值?

时间:2011-04-28 19:34:22

标签: ruby xml nokogiri

我需要从此标记中提取网址:

<media:content url="http://video.ted.com/talk/podcast/2011/None/MikeMatas_2011.mp4" fileSize="15533795" type="video/mp4" />

目前我使用此代码,但我只获得nil值:

page_content = Nokogiri::XML(open("http://www.ted.com/talks/rss"))

page_content.xpath('//item').each {|item|
   @url = course_hash[:videoUrl] = item.at_xpath('[media:content]')['url']
   puts @url
}

2 个答案:

答案 0 :(得分:1)

您尝试访问的节点具有media命名空间,因此当您尝试找到它时,您需要将其考虑在内。

一般来说,我们会做类似的事情:

require 'nokogiri'

xml = %q{
<xml xmlns:media="http://xml.my.org/file">
 <media:content url="http://video.ted.com/talk/podcast/2011/None/MikeMatas_2011.mp4" fileSize="15533795" type="video/mp4" /> 
</xml>
}

doc = Nokogiri::XML(xml)
doc.search('//media:content', 'media' => 'http://xml.my.org/file').each do |n|
  puts n['url']
end
# >> http://video.ted.com/talk/podcast/2011/None/MikeMatas_2011.mp4

Nokogiri会自动注册命名空间,如果它在<xml>标签中定义,这意味着我们可以使用更简单的形式:

doc.search('//media:content').each do |n|
  puts n['url']
end
# >> http://video.ted.com/talk/podcast/2011/None/MikeMatas_2011.mp4

Nokogiri还支持将CSS访问器与命名空间一起使用:

doc.search('media|content').each do |n|
  puts n['url']
end
# >> http://video.ted.com/talk/podcast/2011/None/MikeMatas_2011.mp4

答案 1 :(得分:0)

我认为你的xpath表达式搞砸了:尝试使用item.at_xpath('media:content')['url']代替。