2011-04-28 51 views
0

我需要提取此标签的网址:如何使用Nokogiri从XML获取属性/选项值?

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

目前我使用这个代码,但我只得到零值:

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 
} 
+0

这将有助于了解指向您正在检索的XML的URL,或者有一个缩小的XML示例,包括'xmlns'声明。 – 2011-05-01 02:41:29

回答

0

我觉得你的XPath表达式搞砸:尝试使用item.at_xpath('media:content')['url']代替。

+1

只是:item.xpath('media:content')。first ['url'] – Guillaume 2011-04-28 20:36:31

+0

'item.at_xpath('media:content')['url']'应该和'item.xpath ( '媒体:内容')第一[ 'URL']'。 'at_xpath(expression)'是'xpath(expression).first'的简写形式(http://nokogiri.org/Nokogiri/XML/Node.html#method-i-at_xpath) – William 2011-04-29 13:06:55

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