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
- public class FeedItemModel
- {
- public String Title { get; set; }
- public Uri Link { get; set; }
- public DateTime Date { get; set; }
- public Int32 Duration { get; set; }
- public String Creator { get; set; }
- public String Description { get; set; }
- }
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
- public void ReadRssFeedAsync ( Uri feedUri )
- {
- WebClient client = new WebClient ( );
- client.DownloadStringCompleted += new DownloadStringCompletedEventHandler ( client_DownloadStringCompleted );
- client.DownloadStringAsync ( feedUri );
- }
-
- private void client_DownloadStringCompleted ( object sender, DownloadStringCompletedEventArgs e )
- {
- if ( e.Error == null )
- {
- XDocument doc = XDocument.Parse ( e.Result );
-
- var items = from item in doc.Descendants ( "item" )
- select new FeedItemModel ( )
- {
- Title = item.Element ( "title" ).Value,
- Link = new Uri ( item.Element ( "link" ).Value.ToString ( ) ),
- Date = ConvertToDateTime( item.Element ( "pubDate" ).Value ),
- Creator = item.Element ( XName.Get("creator", "http://purl.org/dc/elements/1.1/") ).Value,
- Description = ReplaceHTMLChars(item.Element ( "description" ).Value),
- Duration = GetDurationFromDescriptionn(item.Element("description").Value),
- };
-
- if ( this.RssFeedReadCompleted != null )
- RssFeedReadCompleted ( this, new RssFeedReadCompletedEventArgs ( ) { Feeds = items } );
- }
- }
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)