André Alves de Lima

Talking about Software Development and more…

Lendo RSS em C#

O formato RSS (rich site summary) é um padrão utilizado para expor atualizações de websites de forma que elas possam ser facilmente consumidas. Eu particularmente utilizo o Feedly para acompanhar as atualizações dos meus sites favoritos (antigamente utilizava o Google Reader, mas, infelizmente ele sumiu do mapa). Se você ainda não pratica esse hábito, eu sugiro fortemente que você comece a praticá-lo. Mas, enfim, o assunto do artigo tem justamente a ver com o consumo de feeds RSS. Vou mostrar para você duas formas de ler RSS em C#.

Ler RSS em C# não é uma tarefa muito complicada, principalmente se você estiver utilizando o .NET 3.5 ou superior e a feed que você estiver lendo tenha o formato Atom 1.0 ou RSS 2.0. Nesse caso, o próprio .NET tem uma classe utilitária que ajuda na leitura desse conteúdo, a classe SyndicationFeed.

Lendo RSS em C# utilizando SyndicationFeed

O foco desse artigo é mostrar como acessar os dados da feed RSS, e não como mostra-los de maneira bonita. Portanto, para demonstrar a leitura de RSS em C# vamos utilizar um projeto do tipo “Console Application“. Se você quiser enfeitá-lo depois, fique à vontade e utilize esses conceitos para criar uma aplicação WPF que mostra esse conteúdo em 3D girando na tela (hehehe).

Com o projeto criado, temos que adicionar a referência ao assembly
System.ServiceModel, uma vez que a classe SyndicationFeed está implementada nesse assembly e ele não é adicionado por padrão em novos projetos. Após termos adicionado essa referência, podemos seguir com a implementação do exemplo.

Primeiramente temos que criar um XmlReader passando a URL da feed. Esse XmlReader será passado para o método estático Load da classe SyndicationFeed. Feito isso, é só iterar pela coleção de Items da feed e acessar o conteúdo exposto pelo RSS.

            using (var reader = System.Xml.XmlReader.Create("http://feeds.feedburner.com/andrealveslima?format=xml"))
            {
                System.ServiceModel.Syndication.SyndicationFeed feed = System.ServiceModel.Syndication.SyndicationFeed.Load(reader);

                foreach (var feedItem in feed.Items)
                {

                }

                Console.ReadLine();
            }

A coleção Items contém um conjunto de SyndicationItems. Confira na documentação dessa classe todas as propriedades que você pode utilizar para acessar os atributos do seu feed. Para te ajudar eu tirei um screenshot do QuickWatch apontando para uma instância dessa classe:

Agora ficou fácil. É só acessar as propriedades desejadas dentro do foreach e imprimir os atributos na tela. Veja como fica o código para imprimir o título, URL, data de publicação e resumo de cada item da feed:

            using (var reader = System.Xml.XmlReader.Create("http://feeds.feedburner.com/andrealveslima?format=xml"))
            {
                System.ServiceModel.Syndication.SyndicationFeed feed = System.ServiceModel.Syndication.SyndicationFeed.Load(reader);

                foreach (var feedItem in feed.Items)
                {
                    Console.WriteLine(feedItem.Title.Text);
                    Console.WriteLine("{0} - {1}", feedItem.Links.First().Uri.ToString(), feedItem.PublishDate);
                    Console.WriteLine(feedItem.Summary.Text);
                    Console.WriteLine("----------------------------------------------------");
                    Console.WriteLine("----------------------------------------------------");
                }

                Console.ReadLine();
            }

Como eu mencionei anteriormente, a classe SyndicationFeed suporta somente feeds que utilizem o formato Atom 1.0 ou RSS 2.0. Mas, e se a feed que você quiser acessar utilize um formato mais antigo? Esse foi o problema que eu tive quando estava escrevendo o artigo sobre tiles para a revista .NET Magazine. No meio desse artigo eu acesso o feed da DevMedia para listar os últimos tópicos na tile do aplicativo de exemplo. Porém, o feed da DevMedia utiliza RSS 0.91.

O que acontece quando tentamos utilizar a classe SyndicationFeed com esse tipo de RSS?

An unhandled exception of type ‘System.NotSupportedException’ occurred in System.ServiceModel.dll
Additional information: Error in line 2 position 2.

Mas, não se preocupe. Existe uma outra maneira para lermos esse tipo de RSS.

Lendo RSS em C# utilizando a biblioteca Argotic

A biblioteca Argotic Syndication Framework implementa a funcionalidade de leitura de feeds RSS, Atom, OPML, entre outros. E essa biblioteca suporta feeds RSS com versões mais antigas que a 2.0. Para utilizá-la, basta adicionar uma referência utilizando o NuGet (procure por “Argotic” e instale a opção “Argotic.Core” – caso precise, veja aqui maiores informações sobre como utilizar o NuGet).

Com a biblioteca adicionada, basta utilizarmos o método “Create” da classe Argotic.Syndication.RssFeed passando a URL da feed. Com a feed instanciada, acesse os itens da feed através da propriedade Channel.Items. Veja como fica o resultado na listagem a seguir.

            var feed = Argotic.Syndication.RssFeed.Create(new Uri("http://www.devmedia.com.br/xml/devmedia_full.xml"));
            foreach (var feedItem in feed.Channel.Items)
            {
                Console.WriteLine(feedItem.Title);
                Console.WriteLine(feedItem.Link.ToString());
                Console.WriteLine(feedItem.Description);
                Console.WriteLine("----------------------------------------------------");
                Console.WriteLine("----------------------------------------------------");
            }

            Console.ReadLine();

Concluindo

Como pudemos conferir nesse artigo, é muito simples lermos RSS em C#. Se você estiver utilizando .NET 3.5 ou superior e sua feed utilize Atom 1.0 ou RSS 2.0, basta tomar proveito da classe SyndicationFeed, presente nativamente no próprio .NET Framework. Já se você tiver o azar de estar utilizando uma versão mais antiga do .NET Framework ou se a feed estiver utilizando uma versão mais antiga do RSS, nem tudo está perdido. A biblioteca Argotic é uma ótima substituta para a classe SyndicationFeed.

Para ficar por dentro dos próximos artigos do meu site, assine a minha newsletter clicando aqui ou utilizando o formulário logo abaixo. Caso prefira, você pode também assinar o feed RSS utilizando este link.

Até a próxima!

André Lima

Image by Equipe Teia MG used under Creative Commons
https://www.flickr.com/photos/teiamg/4136268819

Newsletter do André Lima

* indicates required



Powered by MailChimp

One thought on “Lendo RSS em C#

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *