Bem nunca escrevi sobre tecnologia aqui no blog, mas tudo tem a sua primeira vez!
Então vamos lá, hoje trago um exemplo de leitor de RSS, é bem simples a solution esta no VS 2012.
Utilizei como fonte de pesquisa o site http://www.geekpedia.com/tutorial147_Creating-an-RSS-feed-reader-in-Csharp.html , que mostra como fazer uma solução voltada para desktop. Achei uma solução prática e fiz algumas adaptações para pode utilizar o exemplo para fazer um Web Forms.
O RSS
O RSS (Really Simple Syndication – RSS 2.0) é uma maneira simplificada de apresentar conteúdo de um site, ele é construído em XML (eXtensible Markup Language) e pode ser acessado por um programa especifico ou sites agregadores.Uma das vantagens é que não é preciso acessar um determinado site, ou sites, para ver o que esta sendo atualizado ou postado, com o leitor de RSS você escolhe o tipo de informação (muitos RSS são separados por categorias, tais como: Tecnologia, Economia, etc..) que deseja e de quais sites em um único lugar.
Codificando
Primeiro passo foi criar uma solução web no VS 2012, conforme segue figura abaixo.O VS 2012, cria um projeto web forms , ficando como a figura abaixo, no caso utilizei o template criado já que é apenas um exemplo, única coisa que fiz depois foi apagar a pasta “Account” e os arquivos “About.aspx” e “Contact.aspx”, utilizando apenas a “Default.aspx” e editei a master page, “Site.Master”.
Depois adicionei um novo projeto a solução, com o nome de Util, é ai que vamos codificar as classes para fazer a leitura de um RSS Feed.
Escolhemos então o tipo de projeto, escolhi uma Class Library, que irá criar uma dll que será utilizado como referencia no projeto web.
O VS 2012 por default cria uma classe Class1 que não iremos utilizar.
Então criaremos duas classes, a classe Feed e a classe RssReader. A classe Feed será o objeto que será criado a partir da leitura do RSS, para cada item do XML será criado um feed e adicionado em uma lista. Já o RssReader será responsável por ler o endereço e preencher essa lista.
Classe Feed
namespace Util
{
///
/// Class Feed
///
public class Feed
{
#region Property
public string Titulo { get; set; }
public string Descricao { get; set; }
public string Link { get; set; }
#endregion Property
}
}
Classe RssReader
using System;
using System.Collections.Generic;
using System.Xml;
namespace Util
{
///
/// Class RssFeed
///
public class RssReader
{
#region Private properties
private string url;
private XmlTextReader rssReader;
private XmlDocument rssDoc;
private XmlNode nodeRss;
private XmlNode nodeChannel;
private XmlNode nodeItem;
#endregion Private properties
///
/// Constructor
///
/// url do feed
public RssReader(string url)
{
this.url = url;
}
///
/// Return feeds
///
///
public IList
{
IList
if (string.IsNullOrEmpty(this.url))
{
throw new Exception("A url não pode ser vazia!");
}
else
{
rssReader = new XmlTextReader(this.url);
rssDoc = new XmlDocument();
rssDoc.Load(rssReader);
// Loop for the rss tag
for (int i = 0; i < rssDoc.ChildNodes.Count; i++)
{
// If it is the rss tag
if (rssDoc.ChildNodes[i].Name == "rss")
{
// rss tag found
nodeRss = rssDoc.ChildNodes[i];
}
}
// Loop for the channel tag
for (int i = 0; i < nodeRss.ChildNodes.Count; i++)
{
// If it is the channel tag
if (nodeRss.ChildNodes[i].Name == "channel")
{
// channel tag found
nodeChannel = nodeRss.ChildNodes[i];
}
}
// Loop for the title, link, description and all the other tags
for (int i = 0; i < nodeChannel.ChildNodes.Count; i++)
{
// If it is the item tag, then it has children tags which we will add as items to the List
if (nodeChannel.ChildNodes[i].Name == "item")
{
nodeItem = nodeChannel.ChildNodes[i];
// Create a item to the List containing information from inside the nodes
Feed feed = new Feed();
feed.Titulo = nodeItem["title"].InnerText;
feed.Link = nodeItem["link"].InnerText;
feed.Descricao = nodeItem["description"].InnerText;
listRetorno.Add(feed);
}
}
}
return listRetorno;
}
}
}
Agora vamos para o projeto web, é lá que iremos fazer a chamada que fará a leitura do RSS Feed.
Primeiramente, vamos criar um Text Box e um Button para poder ler o endereço e carregar as informações de um feed.
Agora vamos adicionar um GridView onde serão carregadas as informações, após o clique no botão carregar.
No GridView vamos adicionar um Hyperlink Field, clique no grid e depois escolha “Edit Columns...” e escolha a opção “HyperLinkField” e clique em “Add”. Nomeie a propriedade “HeaderText” para “Rss Feed” que como nome já diz será o nome do cabeçalho da coluna.
Ainda na mesma tela na propriedade "NavigateUrl" coloque Link, essa propriedade virá da lista de objeto que será o DataSource do grid, essa lista será populada com objeto do tipo Feed, que foi criada anteriormente no projeto Util. E na propriedade “DataTextField” será colocado a propriedade Titulo, que também virá da lista de objetos do tipo Feed.
Agora vamos codificar a ação do botão, é ai que vamos chamar o método que responsável por popular o grid com as informações. Na página “Default.aspx” iremos dar um duplo clique no botão “Carregar...”, ele irá nos jogar para a tela onde iremos codificar (Code-Behind)
Antes de colocar o trecho de código com a chamada do método, devemos fazer a referencia ao projeto Util, para podermos utilizar as classes criadas.
Para adicionar é muito simples, basta clicar com o botão direito no projeto RssReader, e escolher a opção “Add reference...”
Escolha a opção “Solution” e em seguida escolha o projeto Util
Então colocamos o seguinte trecho de código:
protected void btnOk_Click(object sender, EventArgs e)
{
try
{
//set the object
Util.RssReader readerFeed = new Util.RssReader(txtUrl.Text);
//load url
GridView1.DataSource = readerFeed.RetornaFeeds();
GridView1.DataBind();
}
catch (Exception ex)
{
Page.ClientScript.RegisterStartupScript(this.GetType(), "Alert",
"alert('" + ex.Message + "');", true);
}
}
Depois, é só executar e está pronto!
Podem ter certeza, demorei muito mais tempo fazendo o tutorial do que a solução em si!
Espero ter ajudado e quaisquer dúvidas podem falar, caso eu não saiba responder ai procuro a resposta!
Link com a solution - RssReader.zip
Abraços! :)