Ruby 2.5.0下用sax-machine/Nokogiri解析media:thumbnail图片URL问题
解决sax-machine解析带命名空间的media:thumbnail元素问题
你遇到的问题是因为sax-machine对带XML命名空间的元素需要显式声明命名空间才能正确解析,直接用:"media:thumbnail"这种带冒号的写法并不被正确识别。下面是具体的解决步骤:
首先,你需要在你的sax-machine解析类中显式声明media命名空间,注意命名空间的URI必须和你要解析的XML里声明的media命名空间完全一致(YouTube的RSS/Atom feed里media命名空间通常是http://search.yahoo.com/mrss/)。然后再指定解析thumbnail元素并提取url属性。
完整的代码示例:
require 'sax-machine' # 定义解析类 class YoutubeFeedItem include SAXMachine # 声明media命名空间,URI要和XML中的xmlns:media对应 namespace :media, 'http://search.yahoo.com/mrss/' # 解析media命名空间下的thumbnail元素,提取url属性作为image_url element :thumbnail, as: :image_url, value: :url, namespace: :media end # 测试解析 sample_xml = <<~XML <item xmlns:media="http://search.yahoo.com/mrss/"> <media:thumbnail url="https://i2.ytimg.com/vi/E4txwB96eBk/hqdefault.jpg" width="480" height="360"/> </item> XML item = YoutubeFeedItem.parse(sample_xml) puts item.image_url # 输出: https://i2.ytimg.com/vi/E4txwB96eBk/hqdefault.jpg
关键说明:
- 必须先通过
namespace :media, "URI"绑定命名空间的前缀和对应的URI,sax-machine才能正确识别该命名空间下的元素。 - 用
element :thumbnail指定元素的本地名(去掉冒号后的部分),再通过namespace: :media关联到之前声明的命名空间。 - 要确保XML中存在对应的命名空间声明(比如
xmlns:media="http://search.yahoo.com/mrss/"),否则解析器无法匹配到目标元素。
内容的提问来源于stack exchange,提问作者Anton Ipatov
相关产品推荐
相关产品推荐

