RSS – Um Guia para Desenvolvedor (Parte 1)

Fernando Cerqueira

RDF Site Summary, “Rich Site Sumary” ou “Really Simples Syndication” são os acrônimos desta sigla que cada vez mais aparece nos sites que visitamos; (Normalmente sobre o ícone de uma área retangular laranja com o texto “XML”, eXtensible Markup Language”, escrito).

Conhecer seus elementos, seus conceitos e acompanhar pelo artigo os detalhes de uma criação de uma classe completa para RSS é objetivo deste artigo, que foi divido em 2 partes :

Parte 1:Conceitos, História, estrutura e especificação do RSS 2.0.

Parte 2:Implementação de uma classe completa baseada na especificação 2.0

Ao final teremos condições, por exemplo:

• Conhecer e compreender a estrutura de RSS

• Implementar uma classe de comunicação poderosa para nossos aplicativos na web.

• Termos uma classe funcional que podemos usar para fazer um agregador RSS com “validator” e gerador de RSS.

Ao final do artigo – Parte 1, mostraremos também uma forma muito simples de como utilizar o XML e XSL com os componentes que vem com o Visual Studio para gerar um leitor de RSS com pouquíssimas linhas.

Antes de iniciamos esta jornada juntos, vamos ver pouco de história e algumas característica deste padrão de documento que vem se tornando muito comum.

Início da páginaInício da página

Um pouco de História e as versões do RSS

O RSS foi criado pela Netscape para ser usado na troca de documentos entre os websites, isso em meados de março de 1999 com a versão 0.90 sobre a sigla “Rich Site Sumary”. A idéia desde o lançamento agradou a outros fabricantes que começaram vislumbrar um uso maior para sua utilização e com a troca das empresas que contratavam as versões foram criadas novas versões, buscando focar na simplicidade de estrutura e especificação. Criou-se então, outro padrão e outro acrônimo para a sigla: “Really Simples Syndication”. Neste meio tempo outro grupo de desenvolvedores resolveu evoluir o padrão original que estava baseado nas especificações do W3C, RDF Site Summary (Resouce Description Framework). Quem observa os números das versões cai em uma “pegadinha” observem:

Olhando temos a impressão que a ultima versão é RSS 2.0, o que não deixa de ser uma verdade, mas para uma das especificações, pois a RSS. 1.0 se baseia no RDF e a 2.0 não, logo temos 2 padrões, e claro 2 versões mais atuais, embora sejam semelhantes em muitos aspectos. Este artigo esta baseado na versão 2.0. Atualmente existe um projeto em desenvolvimento para unificação dos formatos e uma organização que atenda as novas necessidades: o Projeto ATOM. Ao final do artigo disponibilizamos uma referencia e link a este projeto.

Início da páginaInício da página

O porquê de sua popularidade

Não existe nada mais chato que recebemos informações em nossos e-mails sem solicitamos, ou ainda perdemos tempo lendo e garimpando informações em sua maioria irrelevantes.

A adoção de RSS reverte este quadro colocando de volta o usuário no controle do que deseja fazer, de onde e quando deseja ler. Acreditamos esta ser a grande explosão dos Blogs e a popularidade cada vez mais deste padrão. Adotar o uso do RSS é disponibilizar aos seus clientes uma ferramenta poderosa de comunicação, de forma politicamente correta uma vez a decisão e escolha é feita de forma ativa pelo usuário.

Início da páginaInício da página

Estrutura e especificação da RSS 2.0

RSS é um documento em conformidade com a especificação XML 1.0. O “top level” do XML é sempre a tag <RSS version=”XXXX”>. Abaixo temos apenas 1 elemento chamado channel, que por sua vez possui diversos outros elementos organizados de forma hierárquica. Abaixo um exemplo de uma estrutura mínima para um documento RSS:

<?xml version="1.0" ?> 
   - <rss version="2.0">
   - <channel>
         <title></title> 
         <link></link> 
         <description></description> 
              <item>
             <title></title> 
       </item>
              <item>
             <description></description> 
       </item>
  </channel>
</rss>

Valem ler em detalhes todos os elementos inclusive os elementos opcionais e seus link´s. Existem muitas funcionalidades pouco divulgadas como, por exemplo, um elemento (<cloud>) que especifica o suporte a Web-Services que pode ser implementado sobre HTTP-POST, XML-RPC ou SOAP 1.1.

Início da páginaInício da página

Descrição de cada elemento RSS 2.0

*
*

<?xml version="1.0" ?>

Especificação para o padrão XML Obrigatório
Deve ser o primeiro elemento do Documento RSS

<rss version="XXX"></rss>

Elemento Raiz Obrigatório
O atributo version é obrigatório. Valores possíveis para version: 0.91, 0.92, 0.93, 0.94, 2.0.

<channel></channel>

Canal Obrigatório
Tag principal que “envolve” todos os demais itens. Só existe uma única ocorrência desta Tag no documento. Descreve as características e itens que estão sendo disponibilizados no documento.

<title></title>

Título Obrigatório
Define título do documento / Canal. É o nome que é referenciado para seu serviço. Normalmente tem o mesmo nome do web site que gera o documento RSS.

<link></link>

URL da origem do documento Obrigatório
Informa a URL do documento que corresponde o documento / canal. Ex.:http://www.gurj.net/RSSFeed

<description></description>

Descrição do conteúdo do documento / Canal Obrigatório
Descreve de forma resumida o que deve ser esperado encontrar de informação.

<language></language>

Língua que esta escrita o documento Opcional
Informa a língua que o documento esta escrito. A descrição da língua deve ser feita de acordo com a especificação do W3C (http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes) ou pela padronização da Netscape (http://blogs.law.harvard.edu/tech/stories/storyReader$15)Ex: pt-BR

<copyright></copyright>

CopyRight Opcional
Informação de copyright caso exista.

<managingEditor></managingEditor>

Responsável Editorial Opcional
E-mail do responsável pelo conteúdo editorial do documento.

<webMaster></webMaster>

Responsável Técnico Opcional
E-mail do responsável técnico do documento.

<pubDate></pubDate>

Data de Publicação Opcional
Data de publicação do documento. A Data e hora devem estar em conformidade com as especificações RFC822 (http://asg.web.cmu.edu/rfc/rfc822.html). Ex: Sun, 17 Out 2004 14:30:00 GMT

<lastBuildDate></lastBuildDate>

Data de Alteração Opcional
Data da última modificação do documento após a publicação. A Data e hora devem estar em conformidade com as especificações RFC822 (http://asg.web.cmu.edu/rfc/rfc822.html). Ex: Sun, 17 Out 2004 14:30:00 GMT

<category></category>
Atributo Opcional
domain

Categoria documento Opcional
Informa a categoria do documento. Pode-se informar mais de uma categoria.
Como podem existir diversas categorias dentro de um documento e até categorias de sintaxe igual para documentos diferentes existe um atributo opcional para esta tag que informa a url do domínio referente a esta categoria. Obs.: Esta tag se repete para cada categoria informada. Ex: <category domain="http://www.gurj.net">Artigos </category>

<generator></generator>

Gerador do documento Opcional
Informa o programa ou processo que gerou o documento.

<docs></docs>

Documentação sobre o formato Opcional
Informa a url para a documentação de especificação e formatação do documento. Ex.:http://blogs.law.harvard.edu/tech/rss

<cloud></cloud>
Atributos
domain
port
path
registerProcedure
protocol

Suporte a Web-Services Opcional
Define as interfaces para suporte a integração com web services baseado nos 5 atributos da tag :
Um detalhamento sobre esta funcionalidade pode ser vista em : http://blogs.law.harvard.edu/tech/soapMeetsRss#rsscloudInterface
Um exemplo desta implementação foi feita pela no produto da UserLand : Radio UserLand (http://radio.userland.com/)
EX: <cloud domain=“gurj.net" port="8080" path="/RPCFEED" registerProcedure="CloudNet" protocol="soap"/>

<ttl></ttl>

Tempo de cache do Documento Opcional
Define o tempo em minutos que o documento fica “cacheado”. Utilizado em portais de serviços de documentos muitos dinâmicos onde a linha de tempo da informação pode ser um dado determinante a ser registrado.

<image></image>

Sub-elementos
(Obrigatório)
<url></url>
<title></title>
<link></link>

Sub-elementos
(opcionais)
<width></width>
<height></height>

Logotipo ou imagem que pode ser apresentada junto com documento Opcional
informa um arquivo de imagem do tipo GIF, JPEG ou PNG.

<url></url> - Url para o arquivo de imagem

<title></title> - Descrição da imagem que deve ser associado ao atributo ALT da tag HTML <img>.

<link></link> - Url para o site do documento. Normalmente tem o mesmo conteúdo do elemento <link></link> em Chanel.

<width></width> - Se informado define a largura da imagem e possui valor máximo de 144px . O valor default é de 88px

<height></height> - Se informado define a altura da imagem e possui valor máximo de 400px . O valor default é de 31px.

<rating></rating>

Classificação do Documento Opcional
Define a classificação do documento de acordo com as especificações PICS - Platform for Internet Content Selection (http://www.w3.org/PICS/).
Esta especificação originalmente foi feita para ajudar os pais e professores a controlar o tipo de conteúdo que previamente esta sendo recebido.

<textinput></textinput>

Sub-elementos
(Obrigatório)
<title></title>
<description></description>
<name></name>
<link></link>

Campo de texto de entrada Opcional
Esta especificação não é clara nas documentações, sendo ignorada em quase todos os leitores. A idéia seria criar uma interação com o usuário, porem não se obteve nenhuma aplicação baseada nesta funcionalidade.

<title></title> - Título do botão de submit de um suposto formulário

<description></description> - Texto que descreve a intenção da caixa de texto.

<name></name> - Nome a ser atribuído ao objeto da caixa de texto.

<link></link> - URL para o request do formulário ou script a ser executado.

<skipHours></skipHours>

Sub-elementos
(Obrigatório)

<hour></hour>

Horas “OFF” da origem do Documento Opcional
A proposta desta campo é informar as horas em que o canal que origina o documento não esta disponível para leitura ou não terá atualização.
Este elemento possui um sub-elemento <hour></hour> que ocorre para cada hora que se deseja informar. Os valores válidos são: 0 a 23.

<skipDays></skipDays>

Sub-elementos
(Obrigatório)
<day></day>

Dias “OFF” da origem do Documento Opcional
A proposta desta campo é informar os dias da semana que o canal que origina o documento não esta disponível para leitura ou não terá atualização.
Este elemento possui um sub-elemento <day></day> que define os dias da semana que se deseja informar. Para cada dia deve ser colocado um sub-elemento. Os valores válidos são: Monday, Tuesday, Wednesday, Thursday, Friday, Saturday or Sunday.

<item></item>

Sub-elementos
(opcionais)
Ver em detalhes abaixo

Itens do documento Opcional
Os itens são na realidade os tópicos, artigos, noticias que se deseja informar no documento. Este elemento ocorre “n” vezes no documento representando para cada ocorrência uma mensagem, informação ou historia a ser apresentada.
Todos os subitens são opcionais, porem o elemento <title></title> ou <description></description> devem estar presentes.

Início da páginaInício da página

Detalhamento dos subitens de <item></item>

*
*

<title></title>

Título do item Opcional (caso exista o elemento <description></description>)
Título do item , artigo , notícia ou informação.

<description></description>

Descrição do item Opcional (caso exista o elemento <title></title>)
Descreve a informação ; conteúdo a ser passado.

<link></link>

URL para a origem do item Opcional
Informa a URL onde se origina o texto do item.

<author></author>

Autor do Item / Artigo / Notícia Opcional
E-mail do autor

<category></category>

Atributo Opcional

domain

Categoria do item Opcional
Informa a categoria. Pode-se informar mais de uma categoria. Ver mais detalhes no elemento <category></category> de Chanel.

<comments></comments>

Comentários do item Opcional
Informa a url onde se encontra os comentários para este item. Existem algumas restrições de sintaxe e de versão que podem ser vista em: (http://blogs.law.harvard.edu/tech/rss#ltcommentsgtSubelementOfLtitemgt)

<enclosure></enclosure>

Atributos

url
length
type

Arquivo de Anexo do item Opcional
Descreve um local, tamanho e tipo de um arquivo que pode ser baixado e que faz parte do documento como um anexo em separado.

Podemos citar um RSS de exemplo contendo títulos de musicas e nestes elementos teríamos os dados necessários para baixara musica desejada.

url - URL para o arquivo
Length – Tamanho do arquivo em bytes
Type - MIME type do arquivo que será baixado.
EX:
<enclosure url="http://www.mymusic.org/mp3/TheSong.mp3" length="245370" type="audio/mpeg" />

<guid></guid>

Atributos
isPermaLink

ID de identificação Único Opcional
Texto que descreve de forma única o item dentro do documento e também sobre qualquer outro documento.

isPermaLink – Este atributo opcional define se o conteúdo da guid é uma url válida . O valor default para este atributo é true.

Este elemento é bastante útil para identificamos quando se recebe um novo elemento dentro um aplicativo de agregação. Normalmente a guid inicia-se com o domínio do documento seguindo de um identificador que normalmente é uma pagina.

<pubDate></pubDate>

Data de Publicação do item Opcional
E-mail do responsável pelo conteúdo editorial do documento.

Data de publicação. A Data e hora devem estar em conformidade com as especificações RFC822 (http://asg.web.cmu.edu/rfc/rfc822.html) Ex: Sun, 17 Out 2004 14:30:00 GMT

<source></source>

Atributos
url

Origem da informação do item Opcional
A intenção deste elemento de um modo geral é informar a fonte de dados que originou a informação complementando os dados do elemento <link></link> em chanel. Serve como um elemento de divulgação / encaminhamento para os agregadores que tem uma informação para “feedback” do item.

url – Este atributo opcional define se a url para uma página que contem as informações complementares de origem.

Início da páginaInício da página

O projeto de criação da classe Rss2Lib

Existem várias maneiras de se ler um RSS e atualmente, na internet, se encontra diversos leitores gratuitos. A motivação para criação de uma classe RSS baseada na especificação acima é criar todos os mecanismos de validação e estrutura de criação para facilitar a integração de aplicativos e produtos na plataforma.NET. Na segunda parte deste artigo veremos em mais detalhes algumas destas implementações.

Início da páginaInício da página

Lendo um arquivo RSS de forma simples utilizando poucas linhas de código

Particularmente acho chato ler um artigo extenso e não ter nenhum código de exemplo... rs. Desta forma resolvi colocar abaixo uma solução bastante eficiente para ler RSS se valendo do conceito de herança que esta presente na plataforma.NET. Minha linguagem do coração é o Visual Basic que acompanho desde sua versão 1.0 (há titulo de curiosidade, quando falo versão 1.0 não me refiro a versão for Windows e sim a uma versão DOS! Acreditem existiu.), mas para fazer um pouco diferente desta vez, o exemplo será dado em C#.

Se você for um desenvolvedor curioso e atento devera ter observado que temos um controle de nome Xml (System.Web.UI.WebControls.Xml ). Este controle lê um arquivo XML e mostra seu conteúdo podendo ser formatado ou não por XSLT (eXtensible Stylesheet Language Transformations). Infelizmente o componente somente lê arquivos XML locais não sendo possível sem código ler direto de uma URL, e é ai que entra a herança:

Em Vez de ficamos recriando a “Roda” a utilização e aplicação de herança possibilita ao desenvolvedor escrever pouquíssimo código e reaproveitar a totalidade do componente e/ou classe herdada de uma forma consistente e extensível.

Desta forma apenas criamos uma nova propriedade “UrlDocumentSource“ para guardar a url do documento RSS que desejamos ler, e um método ExecuteUrlRead() para ler e associar a uma stream , para ser colocada na propriedade herdada Document .

using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.Xml;
using System.IO;
using System.Net;
namespace FCIWebControl
{
 /// <summary>
 /// Summary description for WebCustomControl RSS READER.
 /// </summary>
 [
 ToolboxData("<{0}:RssReader runat=server></{0}:RssReader>")
 ]
 public class RssReader :  System.Web.UI.WebControls.Xml
 {
  private string _UrlRss;
  ///  RssReader
  ///
  /// <summary>
  /// Construtor
  /// </summary>
  public RssReader() : base() 
  {
   _UrlRss = "";
  }
  public RssReader(string UrlXml,string XslArq) : base() 
  {
   _UrlRss = UrlXml;
   base.TransformSource = XslArq;
  }
  ///  UrlDocumentSource
  ///  
  /// <summary>
  /// Url do XML a ser Lido
  /// </summary>
  /// <param name="Value"> string contendo a URL </param>
  [Bindable(true),
  Category("Behavior"),
  DefaultValue(""),
  Description("string contendo a URL do XML a ser lido")
  ]
  public string UrlDocumentSource
  {
   get { return _UrlRss; }
   set { _UrlRss = value; }
  }
  ///  ExecuteRead
  ///
  /// <summary>
  /// Lê uma URL em XML baseado nas propiedades UrlDocumentSource e UrlTransformSource
  /// </summary>
  public bool ExecuteUrlRead()
  {
   bool erro = false;
   if(_UrlRss.Length > 0)
   {
    try
    { 
     HttpWebRequest WebReq = (HttpWebRequest)(WebRequest.Create(_UrlRss));
     WebResponse WebResp = WebReq.GetResponse();
     Stream Lcstream = WebResp.GetResponseStream();
     XmlTextReader XmlRd = new XmlTextReader(Lcstream);
     XmlRd.XmlResolver = null;
     XmlDocument InfoXML = new XmlDocument();
     InfoXML.Load(XmlRd);
     base.Document = InfoXML;
    }
    catch 
    {
     erro = true;
    }
   }
   return !erro;
  }
 }
}

O novo controle agora passa a ler um XML de uma URL remota. Falta ainda um pequeno detalhe: Os dados se forem apresentados não estaria um formato de fácil legibilidade. Para resolver isso podemos nos valer da facilidade de transformação de dados por XSLT. Esta facilidade já esta presente em nosso controle graças a herança, bastando associar a propriedade TransformSource o path para o arquivo de transformação.

Como exemplo de um arquivo XSL pode ser usando este abaixo :

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:ms="urn:schemas-microsoft-com:xslt"
      xmlns:dt="urn:schemas-microsoft-com:datatypes">
<xsl:output method="html" indent="yes"/>
<xsl:param name="TITLE"/>
<xsl:template match="rss">
  <xsl:for-each select="channel/item">
    <br>
    <strong><a href="{link}" target="_blank"><xsl:value-of select="title" disable-output-escaping="yes" /></a></strong>
  (<xsl:value-of select="pubDate" />)
    <br></br>
     <xsl:value-of select="description" disable-output-escaping="yes"/>
    </br>
    <br></br>
  </xsl:for-each>
</xsl:template>
<xsl:template match="description">
  <br>
    <xsl:value-of select="."/>
  </br>
</xsl:template>
<xsl:template match="pubDate">
 <xsl:value-of select="formatDate(., 'dd/MM/yyyy')"/>
</xsl:template>
</xsl:stylesheet>
Início da páginaInício da página

Conclusão

Apresentamos nesta primeira parte do artigo uma visão mais detalhado o que é RSS, sua criação, conceito e todos os elementos que compõem a especificação 2.0. Juntamente com a especificação foram citados diversos links que são de extrema valia para os que quiserem se aprofundar neste padrão de comunicação. Ao final foi dado um exemplo de como criar um leitor de forma bastante simples apenas criando uma propriedade e um método de um controle herdado.

Os códigos apresentados têm apenas o intuito de demonstrar a funcionalidade do que foi proposto deixando a cargo do desenvolvedor explorar os recursos, adaptando os conceitos aos mais diversos cenários e melhorando as funcionalidades.

Até o próximo artigo onde demonstraremos a criação da classe RSS2lib que possuirá um gerador de arquivo RSS e um “Validador” para o formato RSS 2.0.

Início da páginaInício da página

Referências:

Anuncio da primeira versão de RSS.

Especificação RSS 2.0

Especificação RSS 1.0

Projeto Atom

Projeto Atom

Projeto Atom

Especificação XML: Site 1, Site 2

Início da páginaInício da página

Sobre o Autor:

Fernando Cerqueira (fernandocerqueira@msn.com) é Microsoft MVP em ASP.NET , possui formação acadêmica em administração de empresas, CEO da FCI Sistemas, especializada em Call Center e BI/CRM. Atuou em diversas empresas de grande porte, sempre utilizando a plataforma Microsoft. Desde 2002 vem trabalhando com o Visual Studio.NET prestando consultoria e treinamento focando os resultados em ASP.NET. Em 2003 criou o GURJ.NET - Grupo de usuários .NET do Rio de Janeiro (www.gurj.net) sendo reconhecido pelo INETA.O grupo já realizou diversos eventos de porte como os Roads Shows e DevDay no Rio de Janeiro. Blog: http://br.thespoke.net/MyBlog/FCerqueira/MyBlog.aspx


Início da páginaInício da página