Nokogiri和XPath中的命名空间前缀未定义

7

我正在尝试解析Youtube Gdata以查看是否存在给定ID的视频。但是它没有常规标记,而是有命名空间。在链接http://gdata.youtube.com/feeds/api/videos?q=KgfdlZuVz7I中,有一个标记:

<openSearch:totalResults>1</openSearch:totalResults>

有一个名为openSearch的命名空间:

xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'

但是我不知道如何在Nokogiri和Ruby中处理它。

以下是部分代码:

xmlfeed = Nokogiri::HTML(open("http://gdata.youtube.com/feeds/api/videos?q=#{video_id}"))
xmlfeed.at_xpath("openSearch:totalResults")

它会出现错误:

Undefined namespace prefix: openSearch:totalResults
1个回答

7

我不确定为什么,但似乎你必须删除命名空间前缀才能获取节点:

xmlfeed.at_xpath("//totalresults")

请注意,我添加了双斜杠,它将搜索范围限定在整个文档中(没有双斜杠将无法工作)。

更新:

根据此答案:如何让Nokogiri理解我的命名空间? 我猜测命名空间(openSearch:totalResults)未正确声明为文档的根节点上的属性,因此Nokogiri会忽略它,这就是为什么上面的选择器有效而带有命名空间的选择器无效的原因。


1
xmlfeed.at_xpath("//totalResults") 不起作用,但 xmlfeed.at_xpath("//totalresults") 起作用了。我写了 puts xmlfeed 到控制台后发现它是区分大小写的 :) 请更新答案以便我接受它。 - Иван Бишевац
完成!我想当我测试时,我一定在控制台中输入了相同的内容,因为它对我起作用了。 - Chris Salzberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接