segunda-feira, 3 de junho de 2013

Tutorial - RSS Feed

Olá, pessoal.
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 RetornaFeeds()
        {
            IList listRetorno = new List();

            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! :)