Как получить значения атрибутов / опций из XML с помощью Nokogiri? - PullRequest
0 голосов
/ 28 апреля 2011

Мне нужно извлечь URL из этого тега:

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

Ответы [ 2 ]

1 голос
/ 01 мая 2011

Узел, к которому вы пытаетесь получить доступ, имеет пространство имен 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
0 голосов
/ 28 апреля 2011

Я думаю, что ваше выражение xpath испорчено: попробуйте использовать item.at_xpath('media:content')['url'].

...