BrSilverlight

Tutoriais e dicas sobre Silverlight

Sobre o autor

Sou Breno Ferreira, desenvolvedor em um Centro de Tecnologia em Petrópolis especializado em Silverlight. Criei este site com o objetivo de postar dicas, tutoriais e artigos sobre Silverlight, WPF e tecnologias Microsoft.

 

Novidades do Silverlight 4 – Parte II: Ler Feeds RSS

Introdução

No post anterior, iniciei uma série de tutoriais que cobre algumas das novas features do Silverlight 4, e escrevi especificamente sobre Elevated Trust em aplicações Out-of-Browser.

Hoje, irei explicar como fazemos para ler um feed RSS utilizando Linq To XML para lermos o XML retornado pelo feed.

Voce pode baixar o código deste tutorial no link abaixo:

http://cid-1498c467c14dc20b.skydrive.live.com/self.aspx/BrSilverlight/Tutoriais/MsdnWebcastsCalendar.zip

Lendo Feeds RSS no Silverlight

Feed RSS nada mais é do que conteúdo XML usado para publicar updates em sites, blogs, etc… Todo feed RSS possui uma URL acessível globalmente, que pode ser acessada por algum cliente e que irá dar como resposta esse XML.

Para lermos o RSS, utilizamos a classe WebClient, que possibilita receber a resposta de algum recurso na web, exposto através de uma URL. Com a resposta deste recurso (XML do RSS), utilizamos o Linq To XML para analisar o XML e ler os dados contidos nele.

Para começarmos, adicione uma classe ao projeto Silverlight chamado FeedItemModel. Essa classe irá ser o Model (usando o Pattern MVVM, mas por enquando ignore isso, veremos isso em um próximo post) que irá guardar as informações do Feed.

Como estaremos lendo o feed dos webcasts no MSDN, temos que guardar algumas informações como:

  • Título do Webcast
  • Link para cadastro
  • Data
  • Duração
  • Criador (quem são os palestrantes)
  • Descrição

Na classe FeedItemModel, adiciona as seguintes propriedades, que irão guardar as informações acima:

Code Snippet
  1. public class FeedItemModel
  2. {
  3.     public String Title { get; set; }
  4.     public Uri Link { get; set; }
  5.     public DateTime Date { get; set; }
  6.     public Int32 Duration { get; set; }
  7.     public String Creator { get; set; }
  8.     public String Description { get; set; }
  9. }

Snippet 1

Agora, temos que ler o conteúdo do feed.

Adicione uma classe chamada RssReader. Essa classe irá possuir um método que faz o download do XML do feed.

Adicione a classe RssReader o seguinte trecho de código:

Code Snippet
  1. public void ReadRssFeedAsync ( Uri feedUri )
  2.         {
  3.             WebClient client = new WebClient ( );
  4.             client.DownloadStringCompleted += new DownloadStringCompletedEventHandler ( client_DownloadStringCompleted );
  5.             client.DownloadStringAsync ( feedUri );
  6.         }
  7.  
  8.         private void client_DownloadStringCompleted ( object sender, DownloadStringCompletedEventArgs e )
  9.         {
  10.             if ( e.Error == null )
  11.             {
  12.                 XDocument doc = XDocument.Parse ( e.Result );
  13.  
  14.                 var items = from item in doc.Descendants ( "item" )
  15.                             select new FeedItemModel ( )
  16.                             {
  17.                                 Title = item.Element ( "title" ).Value,
  18.                                 Link = new Uri ( item.Element ( "link" ).Value.ToString ( ) ),
  19.                                 Date = ConvertToDateTime( item.Element ( "pubDate" ).Value ),
  20.                                 Creator = item.Element ( XName.Get("creator", "http://purl.org/dc/elements/1.1/") ).Value,
  21.                                 Description = ReplaceHTMLChars(item.Element ( "description" ).Value),
  22.                                 Duration = GetDurationFromDescriptionn(item.Element("description").Value),
  23.                             };
  24.  
  25.                 if ( this.RssFeedReadCompleted != null )
  26.                     RssFeedReadCompleted ( this, new RssFeedReadCompletedEventArgs ( ) { Feeds = items } );
  27.             }
  28.         }

Snippet 2

No método ReadRssFeedAsync, recebemos a URI do feed como parâmetro (no caso do feed dos webcasts do MSDN, a URL é: http://www.msdnbrasil.com.br/Microsoft.NewRSS/RssItems.aspx?segment=Arquiteto%20de%20Solu%C3%A7%C3%B5es--and--Desenvolvedores&type=WebCasts%20Online&futureitems=S&auth=747dab31-42e3-69f3-7765-618e61722d9a).

Criamos um objeto do tipo WebClient e chamamos o método DownloadStringAsync, que irá baixar o XML do feed. É importante saber que no Silverlight, qualquer chamada a recursos remotos via HTTP é feita de forma assíncrona, por isso, antes de chamarmos o método DownloadStringAsync, temos que associar o evento DownloadStringCompleted a um método (nesse caso, client_DownloadStringCompleted), que será chamado quando o download terminar.

No método client_DownloadStringCompleted, checamos se houve algum erro no download (if e.Error == null). Se não houve erro, então criamos um XDocument com o conteúdo baixado (e.Result). Então, utilizamos uma Linq query para pegarmos todos os elementos com o nome “item” (doc.Descendants(“item”)) e pegarmos seus elementos filhos, que trazem as informações sobre o Webcast (esses elementos são: title, link, pubDate, …).

Na linha 20, temos que usar o método XName.Get, pois no XML do feed, o elemento “creator” faz parte do XML Namespace “http://purl.org/dc/elements/1.1/” (se voce olhar no conteúdo XML, voce verá que o elemento creator estará assim “dc:creator” e no início do XML, é adicionado o XML namespace dc que aponta para “http://purl.org/dc/elements/1.1/”).

Obs: os métodos “ConvertToDateTime”, “ReplaceHTMLChars” e “GetDurationFromDescriptionn” somente fazem algumas operações auxiliares como limpar caracteres inválidos e fazer algumas operações no texto para pegar a duração do Webcast. Voce pode ver o que essas funções fazem se voce baixar o código da aplicação, no início deste post.

Essa Linq query irá retornar um IEnumerable de FeedItemModel. Mas, como a operação é feita de maneira assíncrona, temos que informar a quem chamou a função ReadRssFeedAsync, que a operação terminou e os resultados foram obtidos. Para isso, criamos um evento que será chamado quando a operação completar (linha 26), passando a coleção de FeedItemModel.

Neste post vimos como ler o Feed RSS com os Webcasts do MSDN. Nos próximos posts, iremos ver como criar um item no calendário do Outlook com os dados do Webcast e juntar todas as funcionalidades na aplicação usando o Pattern MVVM (Model-View-ViewModel)


Permalink | Comentários (0) | Post RSSRSS comment feed

Comentários

Comentar




  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading