Elaborar un Lector de RSS en Silverlight 4

Hoy voy a proponer un proyecto que en si tiene gran utilidad, un lector de Rss en Silverlight 4, en vuestras manos queda darle un toque sofisticado y de ingenio a esta idea inicial.

Vamos a empezar creando un nuevo proyecto de Silverlight 4 en Visual Studio 2010. Una vez realizado nuestro proyecto por defecto, tenemos que extraer un Rss de la página que deseemos. Leer ese Rss, ya que es un archivo XML, transformar cada nodo de ese archivo XML en una cadena y presentarla en el interfaz de usuario.

El primer paso para conseguir nuestra meta, es crear una clase con las propiedades que obtendremos del Rss y que vamos a presentar en cada una de las entradas de la interfaz de usuario. Para ello añadiremos a nuestro proyecto del lado del cliente la siguiente clase(ElementosRSS):

image

  1. using System;
  2. using System.Net;
  3. using System.Windows;
  4. using System.Windows.Controls;
  5. using System.Windows.Documents;
  6. using System.Windows.Ink;
  7. using System.Windows.Input;
  8. using System.Windows.Media;
  9. using System.Windows.Media.Animation;
  10. using System.Windows.Shapes;
  11.  
  12. namespace LeerRSS
  13. {
  14.     public class ElementosRSS
  15.     {
  16.         #region Properties
  17.         public string RSSTitulo { get; set; }
  18.         public Uri RSSEnlace { get; set; }
  19.         #endregion
  20.     }
  21. }

Seguidamente tenemos que añadir una referencia a nuestro proyecto para que pueda leer el archivo XML de la RSS de la página que nosotros decidamos. Presionamos con el botón derecho sobre Referencias y elegimos Agregar Referencia. En la pestaña .NET seleccionamos la referencia System.ServicesModel.Syndication como podemos observar en la siguiente imagen:

image

No debemos de olvidarnos de añadir las referencia a la librería mencionada con anterioridad en MainPage.xaml.cs, que es el código Behind de la interfaz de usuario de Silverlight:

 

  1. using System.Xml;
  2. using System.ServiceModel.Syndication;

 

Dentro del mismo archivo donde hemos incluido las referencia vamos a incluir tres variables. RSSUrl tendrá el valor de la URL de la página de cada una de las entradas del RSS. LectorXML será el encargado de leer el archivo XML que nos ofrece el RSS de la página. Feed que es la encargada de obtener la fuente de sindicación de las diferentes entradas del RSS.

  1. private Uri RSSUrl;
  2. private XmlReader LectorXML;
  3. private SyndicationFeed Feed;

 

 

 

En el constructor(inmediatamente después de InitializaComponent)  deberemos añadir el siguiente fragmento de código:

  1. RSSUrl = new Uri(“http://geeks.ms/blogs/rmayo/rss.aspx”);
  2. WebClient client = new WebClient();
  3. client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
  4. client.DownloadStringAsync(RSSUrl);

Como podemos observar introducimos la url de la página de la que queremos absorber el RSS. La clase WebClient de Silverlight es la encargada de abrir el RSS(XML).Puesto que la operación se realiza de forma asincrónica se llama al método de devolución de llamada (DownloadStringCompleted) después de realiza dicha operación.

Ahora vamos a encargarnos de crear la interfaz de usuario, para ello nos situamos en MainPage.xaml, e introducimos el siguiente fragmento de código XAML:

  1. <UserControl x:Class=”LectorRSS.MainPage”
  2.     xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
  3.     xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
  4.     xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″
  5.     xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″
  6.     mc:Ignorable=”d”
  7.     d:DesignHeight=”300″ d:DesignWidth=”400″>
  8.  
  9.     <Grid x:Name=”LayoutRoot”>
  10.         <Grid.Background>
  11.             <LinearGradientBrush EndPoint=”0.5,1″ StartPoint=”0.5,0″>
  12.                 <GradientStop Color=”Black” Offset=”0″/>
  13.                 <GradientStop Color=”#FFBBB9B9″ Offset=”0.943″/>
  14.             </LinearGradientBrush>
  15.         </Grid.Background>
  16.         <ItemsControl x:Name=”RSS” ItemsSource=”{Binding} Margin=”163,62,150,113″ >
  17.             <ItemsControl.ItemTemplate>
  18.                 <DataTemplate>
  19.                     <HyperlinkButton x:Name=”Title” NavigateUri=”{Binding RSSLink}
  20.              Width=”305″ Margin=”0,22,0,15″ Foreground=”#FFD5C214″
  21.              FontSize=”12″ FontWeight=”Bold”>
  22.                         <!–cada una de las entradas de RSS son introducidas en un hyperlink–>
  23.                         <TextBlock Text=”{Binding RSSTitle} TextWrapping=”Wrap” FontSize=”18.667″ FontFamily=”Times New Roman” Foreground=”#FF0CB8DC” />
  24.                         <!–cada uno de los hyperlinks mostrará el txto de cada una de las entradas–>
  25.                     </HyperlinkButton>
  26.  
  27.                 </DataTemplate>
  28.             </ItemsControl.ItemTemplate>
  29.         </ItemsControl>
  30.     </Grid>
  31. </UserControl>

Lo que hemos introducido en la interfaz de usuario es una plantilla de datos que nos mostrará cada una de las entradas del RSS,en forma de un Hyperlink.Cada Hyperlink  tendrá el titulo de cada una de las entradas de la página de la que obtenemos el RSS.De forma que el usuario al ver cada una de las entradas pueda acceder inmediatamente a ellas.

Ahora, nos centraremos en la creación del método DownloadStringCompleted en MainPage.xaml.cs podemos recuperar el RSS en forma de una cadena. A continuación, podemos crear nuestra XmlReader y cargarlo a una variable de SyndicationFeed que trata el XML como un ‘RSS’ y nos permite utilizar sus propiedades:

  1. private void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
  2.         {
  3.             if (e.Error == null)
  4.             {
  5.                 int itemsCount = 5;//número de entradas del RSS
  6.                 LectorXML = XmlReader.Create(new StringReader(e.Result));//lector de XML
  7.                 Feed = SyndicationFeed.Load(LectorXML); //se introduce el XML en una variable
  8.                 //de tipo SyndicationFeed
  9.  
  10.                 List<ElementosRSS> itemsList = new List<ElementosRSS>();//creamos una colección
  11.                 //para introducir los 5 elementos del RSS
  12.  
  13.                 if (Feed.Items.Count() < 5)
  14.                 {
  15.                     itemsCount = Feed.Items.Count();
  16.                 }
  17.  
  18.                 for (int i = 0; i <= itemsCount; i++)
  19.                 {
  20.                     ElementosRSS rssitem = new ElementosRSS();
  21.                     rssitem.RSSTitulo = Feed.Items.ToList()[i].Title.Text;
  22.                     rssitem.RSSEnlace = Feed.Items.ToList()[i].Links[0].Uri;
  23.                     //introducimos cada una de las propiedades en cada uno de los items de la colección de objetos
  24.                 }
  25.                 RSS.ItemsSource = itemsList;
  26.             }
  27.         }

El último paso es introducir una referencia a nuestro proyecto, para que este consiga leer el archivo xml, podemos introducir la referencia de dos formas:

1-introduciendo de forma manual la referencia

 

  1. using System.IO;

 

 

 

2-Situandonos sobre el elemento que demanda dicha librería  y eligiendo la opción de añadirla que nos ofrece el Itelligence de Visual Studio 2010 como podemos observar en la siguiente imagen:

image

Ahora ya tenemos creado un simple lector de RSS, que nos muestra las diferentes entradas de mi blog. Presionando sobre ellas accederéis al artículo en concreto como podéis observar en la siguiente imagen:

image

Aunque sea un proyecto simple podemos ampliar sus posibilidades, mostrando un resumen de cada uno de los artículos o utilizando dicho proyecto para formar parte de un Webpar en SharePoint, así que la elección la dejo en vuestras manos.

Un comentario en “Elaborar un Lector de RSS en Silverlight 4”

  1. hola, estaba probando tu ejemplo pero tengo el siguiente error con el Feed:

    Error 2 ‘System.Collections.Generic.IEnumerable‘ does not contain a definition for ‘ToList’ and no extension method ‘ToList’ accepting a first argument of type ‘System.Collections.Generic.IEnumerable‘ could be found (are you missing a using directive or an assembly reference?) C:UsersRobeDocumentsExpressionBlend 4ProjectsRSSReaderRSSReaderMainPage.xaml.cs 47 51 RSSReader

    sabes por qué puede ser? no me deja llamar a Feed.Items.ToList para añadir al feed :S

    gracias y un saludo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *