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 :
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.
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.
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.
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.
<?xml version="1.0" ?> | Especificação para o padrão XML Obrigatório | ||||
<rss version="XXX"></rss> | Elemento Raiz Obrigatório | ||||
<channel></channel> | Canal Obrigatório | ||||
<title></title> | Título Obrigatório | ||||
<link></link> | URL da origem do documento Obrigatório | ||||
<description></description> | Descrição do conteúdo do documento / Canal Obrigatório | ||||
<language></language> | Língua que esta escrita o documento Opcional | ||||
<copyright></copyright> | CopyRight Opcional | ||||
<managingEditor></managingEditor> | Responsável Editorial Opcional | ||||
<webMaster></webMaster> | Responsável Técnico Opcional | ||||
<pubDate></pubDate> | Data de Publicação Opcional | ||||
<lastBuildDate></lastBuildDate> | Data de Alteração Opcional | ||||
<category></category> | Categoria documento Opcional | ||||
<generator></generator> | Gerador do documento Opcional | ||||
<docs></docs> | Documentação sobre o formato Opcional | ||||
<cloud></cloud> | Suporte a Web-Services Opcional | ||||
<ttl></ttl> | Tempo de cache do Documento Opcional | ||||
<image></image> Sub-elementos Sub-elementos | Logotipo ou imagem que pode ser apresentada junto com documento Opcional <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 | ||||
<textinput></textinput> Sub-elementos | Campo de texto de entrada Opcional <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 <hour></hour> | Horas “OFF” da origem do Documento Opcional | ||||
<skipDays></skipDays> Sub-elementos | Dias “OFF” da origem do Documento Opcional | ||||
<item></item> Sub-elementos | Itens do documento Opcional |
<title></title> | Título do item Opcional (caso exista o elemento <description></description>) | ||||
<description></description> | Descrição do item Opcional (caso exista o elemento <title></title>) | ||||
<link></link> | URL para a origem do item Opcional | ||||
<author></author> | Autor do Item / Artigo / Notícia Opcional | ||||
<category></category> Atributo Opcional domain | Categoria do item Opcional | ||||
<comments></comments> | Comentários do item Opcional | ||||
<enclosure></enclosure> Atributos url | Arquivo de Anexo do item Opcional
url - URL para o arquivo | ||||
<guid></guid> Atributos | ID de identificação Único Opcional isPermaLink – Este atributo opcional define se o conteúdo da guid é uma url válida . O valor default para este atributo é true.
| ||||
<pubDate></pubDate> | Data de Publicação do item Opcional 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 | Origem da informação do item Opcional url – Este atributo opcional define se a url para uma página que contem as informações complementares de origem. |
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.
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>
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.
Anuncio da primeira versão de RSS.
Especificação XML: Site 1, Site 2
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