首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > Ruby Rails >

ruby way之处置RSS和Atom

2012-11-06 
ruby way之处理RSS和Atom1 rss 标准库RSS 是基于xml的,因此你能简单的将它作为一个xml来进行解析.可是,事

ruby way之处理RSS和Atom
1 rss 标准库

RSS 是基于xml的,因此你能简单的将它作为一个xml来进行解析.可是,事实上他有一个更高级别的专有的解析器来解析他.此外RSS的标准也很混乱。

他有很多不便,就是标准的版本的不兼容,RSS有0.9, 1.0, 和2.0的版本.RSS的版本,就像制造热狗,就是一些除非你一定要知道,否则你不想要知道的细节.

ruby有一个标准RSS库,它包含0.9,1.0和2.0版本标准.不同的版本之间尽可能做到了无缝处理.如果你没有指定版本,这个库他会自己尽可能地检测版本.

看下面的例子,这里我们是从http://marsdrive.com 得到feed:

require 'rss'require 'open-uri'URL = "http://www.marstoday.com/rss/mars.xml"open(URL) do |h|  resp = h.read  result = RSS::Parser.parse(resp,false)  puts "Channel: #{result.channel.title}"  result.items.each_with_index do |item,i|    i += 1    puts "#{i}  #{item.title}"  endend


这个程序很简单,一直要看一下mars.xml的结构就很清晰了.

下面我们来创建一个RSS Feed

require 'rss'feed = RSS::Rss.new("2.0")chan = RSS::Rss::Channel.newchan.description = "Feed Your Head"chan.link = "http://nosuchplace.org/home/"img = RSS::Rss::Channel::Image.newimg.url = "http://nosuchplace.org/images/headshot.jpg"img.title = "Y.T."img.link = chan.linkchan.image = imgfeed.channel = chani1 = RSS::Rss::Channel::Item.newi1.title = "Once again, here we are"i1.link = "http://nosuchplace.org/articles/once_again/"i1.description = "Don't you feel more like you do now than usual?"i2 = RSS::Rss::Channel::Item.newi2.title = "So long, and thanks for all the fiche"i2.link = "http://nosuchplace.org/articles/so_long_and_thanks/"i2.description = "I really miss the days of microfilm..."i3 = RSS::Rss::Channel::Item.newi3.title = "One hand clapping"i3.link = "http://nosuchplace.org/articles/one_hand_clapping/"i3.description = "Yesterday I went to an amputee convention..."feed.channel.items << i1 << i2 << i3puts feed


这个代码也很简单,就是先创建了一个空的RSS 2.0 feed ,然后给他的一些节点开始赋值.

这里要注意我们想要把一些Item对象付给feed.channel.items时,我们不能使用
feed.channel.items = [i1,i2,i3]
这样的代码,我们只能使用items[0] = i1 这样的代码.或者用我们上面代码中的使用<<方法.

很多人可能更喜欢用Atom,比起RSS,可是rss库不支持Atom,但是非标准的feedtools 库支持Atom.我们下面就要介绍它.

2 feedtools Library

feedtools他以无缝的方式工作在Atom和RSS中,它存储所有的feeds作为一个共有的内部的格式.并且它有它自己的url处理代码,因此你不需要显示的使用net/http 或者open-uri.

下面这段代码是用feedtools来处理前面的那个例子:

require "feed_tools"URL = "http://www.marstoday.com/rss/mars.xml"feed = FeedTools::Feed.open(URL)puts "Description: #{feed.title}\n"feed.entries.each_with_index {|x,i| puts "#{i+1} #{x.title}" } 


这段代码比起上面的那段代码更为简洁和清晰.可以看到这里并没有显式的channel 方法,可是你却可以直接在feed对象上调用title等方法,这是因为一个feed就是一个channel.

下面的是存取Atom的例子:

require "feed_tools"URL = "http://www.atomenabled.org/atom.xml"feed = FeedTools::Feed.open(URL)puts "Description: #{feed.title}\n"feed.entries.each_with_index {|x,i| puts "#{i+1}  #{x.title}" }


注意,对比一下这两个代码,不同点只有一个,那就是URL的不同,这就说明我们处理feeds时,不需要知道他被存储为哪种格式.

现在让我们加下面的代码到上面的例子中:

str = feed.build_xml("rss",2.0)puts str


我们所做的就是将Atom feed 转换为RSS2.0的feed.你也可以转换成0.9或者1.0版本.因此我们能读一个RSS的feed然后制造出一个Atom的feed.这个就是这个库的强大之处.

这里要强调一下,我们上面的例子都只是一个小测试,如果你要真正做一个应用程序的话,你要注意处理你的缓存.





热点排行