In questo capitolo ci occuperemo della gestione dei principali formati XML per la distribuzione di contenuti Web: Atom e RSS.
Oltre alla libreria standard RSS esistono molte gemme che si occupano di leggere e scrivere i vari formati dei feed. Di seguito vedremo i più completi. In questo campo di sicuro non mancano soluzioni complete e robuste, oltre a quelli illustrati vanno sicuramente ricordati almeno atomutil
, rfeedreader
e rfeedparser
.
la libreria standard
Iniziamo proprio dalla libreria standard RSS distribuita con Ruby. Questa libreria fornisce sia un parser per la lettura di feed sia un generatore per la creazione di feed RSS. Vediamo un esempio che poi commenteremo.
Scaricare i feed da dall'aggregatore "Planet Ruby"
require 'rss/2.0'
file = open('http://planetruby.0x42.net/rss20.xml')
rss = RSS::Parser.parse(file, false)
puts "Feed from #{rss.channel.title}"
rss.items.each do |post|
puts " " + post.title
end
Dopo aver aperto il file RSS ne facciamo il parsing con RSS::Parser.parse
che ritorna un un oggetto di classe RSS::Rss
.
Stampiamo il nome del feed e poi i titoli dei post. Oltre al titolo è possibile ricavare dalla classe RSS::Rss::Channel
altre utili informazioni sulla data di pubblicazione, sulla lingua dei post, sul copyright, etc.
I post vengono stampati iterando su rss.items che è un array di RSS::Rss::Channel::Item
, anche in questo caso oltre ai commenti è possibile ottenere una descrizione del post, il nome dell'autore, il link, la data di pubblicazione, etc.
Anche la generazione di file RSS è molto semplice e segue lo stesso schema: prima si crea un oggetto di tipo RSS::Rss
a cui va associato un oggetto RSS::Rss::Channel
ed infine ogni post sarà un oggetto RSS::Rss::Channel::Item
che andrà a popolare l'array items
.
Vediamo il codice. Anzitutto importiamo la libreria RSS e creiamo un feed Rss
require 'rss/2.0' rss = RSS::Rss.new("2.0")
Creiamo poi un nuovo canale e ne definiamo le caratteristiche:
channel = RSS::Rss::Channel.new channel.title = "RSS di esempio" channel.link = "http://www.example.com"
Un post d'esempio apparirà in questo modo:
post = RSS::Rss::Channel::Item.new post.title = "Titolo del post" post.description = "Descrizione del post di esempio" post.link = "http://www.example.com/post/1"
Fatto ciò non ci resta che collegare le varie componenti nel giusto modo:
channel.items << post rss.channel = channel
Il risultato è un file XML del genere:
<?xml version="1.0"?> <rss version="2.0"> <channel> <title>RSS di esempio</title> <link>http://www.example.com</link> <item> <title>Titolo del post</title> <link>http://www.example.com/post/1</link> <description>Descrizione del post di esempio</description> </item> </channel> </rss>