Referencias
::  clikear.com
:: MSDN
:: Soporte Microsoft
:: MVP
:: MSDN España
:: MSDN Artículos Téc.
:: Technet España
:: News de Microsoft
:: MSDN Magazine
:: ASP.NET
 
 
  Netveloper :: ASP.NET :: Noticias :: Suscripciones a servicios de noticias RSS d ...  
 
   Suscripciones a servicios de noticias RSS desde ASP.NET  
 Enviar a un amigo
     Fecha:  11/07/2006 23:11:16
     Autor:  Marco Andres Ureña Menacho  Ver comentarios
     Visitas: 11628  Comentarios: 8  Imprimir
 
  Para poder enterarnos de que es lo que pasa en el mundo o si hay nuevos avances en lo que respecta a IT o por ultimo si el blog de un amigo tiene alguna actualización necesitamos recorrer muchos sitios Web a diario, eso incluye tener que ver mucha publicidad y páginas que nunca terminan de cargarse por los gigantescos anuncios de los patrocinadores. Como una muy buena solución se crearon las suscripciones RSS (Relay Simple Syndication).  
   
  Perfecto ahora tenemos un servicio que nos da las noticias que nosotros queremos conocer… y ahora? La idea de este tipo de servicios es bastante simple, permite que se maneje un conjunto de “tags” estándares para la publicación de noticias, lo que permite que cualquiera pueda crear su propia aplicación (ya sea en Web o de escritorio o por ultimo para móvil/pda) para leer el contenido de la suscripción y mostrarlo de alguna manera.

El propósito de este artículo es crear un servicio de noticias y un ejemplo de cómo podemos crear nuestro propio receptor de la suscripción.

Para empezar vamos a ver algo de XML. Como todos ya sabemos (y si no nos estamos enterando) RSS es un conjunto de tags de XML y con una estructura definida, seria algo como esto:


<rss version=”2.0”>
<channel>
  <title></title>
  <link></link>
  <description></description>
  <language></language>
  <copyright></copyright>
  <generator></generator>
  <webmaster></webmaster>
  <lastbuildDate></lastBuildDate>
<item>
  <title></title>
  <link></link>
  <creator></creator>
  <pubDate></pubDate>
  <description></description>
</item>
</channel>
</rss>


Estos son los campos que se usaran para hacer la demostración de este servicio, no obstante se pueden usar mas en base al estándar establecido por la W3C en <a href="http://validator.w3.org/feed/docs/rss2.html" target=_blank>http://validator.w3.org/feed/docs/rss2.html</a>. Comencemos por crear una clase que nos permita crear la estructura XML que vimos antes.


Public Class MiGeneradorRSS
#Region " Miembros Privados "
Private RSS As XmlTextWriter
Private strTituloArticulo As String
Private strLinkArticulo As String
Private strDescripcionArticulo As String
Private strAutor As String
Private datFechaPublicacion As Date
Private strContenido As String
Private strTituloCanal As String
Private strLinkCanal As String
Private strDescripcionCanal As String
Private strCopyRight As String
Private strGenerador As String
Private strWebMaster As String
Private datLastBuild As Date
#End Region
#Region " Propiedades Publicas "
Public Property TituloArticulo() As String
Get
Return strTituloArticulo
End Get
Set(ByVal value As String)
strTituloArticulo = value
End Set
End Property
Public Property LinkArticulo() As String
Get
Return strLinkArticulo
End Get
Set(ByVal value As String)
strLinkArticulo = value
End Set
End Property
Public Property DescripcionArticulo() As String
Get
Return strDescripcionArticulo
End Get
Set(ByVal value As String)
strDescripcionArticulo = value
End Set
End Property
Public Property Autor() As String
Get
Return strAutor
End Get
Set(ByVal value As String)
strAutor = value
End Set
End Property
Public Property FechaPublicacion() As Date
Get
Return datFechaPublicacion
End Get
Set(ByVal value As Date)
datFechaPublicacion = value
End Set
End Property
Public Property Contenido() As String
Get
Return strContenido
End Get
Set(ByVal value As String)
strContenido = value
End Set
End Property
Public Property TituloCanal() As String
Get
Return strTituloCanal
End Get
Set(ByVal value As String)
strTituloCanal = value
End Set
End Property
Public Property LinkCanal() As String
Get
Return strLinkCanal
End Get
Set(ByVal value As String)
strLinkCanal = value
End Set
End Property
Public Property DescripcionCanal() As String
Get
Return strDescripcionCanal
End Get
Set(ByVal value As String)
strDescripcionCanal = value
End Set
End Property
Public Property CopyRight() As String
Get
Return strCopyRight
End Get
Set(ByVal value As String)
strCopyRight = value
End Set
End Property
Public Property Generador() As String
Get
Return strGenerador
End Get
Set(ByVal value As String)
strGenerador = value
End Set
End Property
Public Property WebMaster() As String
Get
Return strWebMaster
End Get
Set(ByVal value As String)
strWebMaster = value
End Set
End Property
Public Property UltimaActualizacion() As Date
Get
Return datLastBuild
End Get
Set(ByVal value As Date)
datLastBuild = value
End Set
End Property
#End Region
#Region " Metodos Publicos "
Public Sub New(ByVal stream As System.IO.Stream, ByVal encoding As System.Text.Encoding)
RSS = New XmlTextWriter(stream, encoding)
RSS.Formatting = Formatting.Indented
End Sub
Public Sub New(ByVal w As System.IO.TextWriter)
RSS = New XmlTextWriter(w)
RSS.Formatting = Formatting.Indented
End Sub
Public Sub EscribirArticulo()
With RSS
.WriteStartElement("item")
.WriteElementString("title", strTituloArticulo)
.WriteElementString("link", strLinkArticulo)
.WriteElementString("description", strDescripcionArticulo)
.WriteElementString("author", strAutor)
.WriteElementString("pubDate", datFechaPublicacion)
.WriteElementString("subject", strContenido)
.WriteEndElement()
End With
End Sub
Public Sub IniciarCanal()
With RSS
.WriteStartDocument()
.WriteStartElement("rss")
.WriteStartAttribute("version", "2.0")
.WriteStartElement("channel")
.WriteElementString("title", strTituloCanal)
.WriteElementString("link", strLinkCanal)
.WriteElementString("description", strDescripcionCanal)
.WriteElementString("language", "es-ES")
.WriteElementString("copyright", strCopyRight)
.WriteElementString("generator", strGenerador)
.WriteElementString("webmaster", strWebMaster)
.WriteElementString("lastBuildDate", datLastBuild)
End With
End Sub
Public Sub CerrarCanal()
With RSS
.WriteEndElement()
.WriteEndElement()
.WriteEndDocument()
.Flush()
.Close()
End With
End Sub
#End Region
End Class


Como verán la clase es bastante sencilla, posee una propiedad por cada dato que necesitamos dentro de la suscripción RSS lo que hace mas visible la información al momento de crear este servicio.

Las funciones deben ser llamadas después de haber llenado las propiedades con sus respectivos valores, por ejemplo todas las propiedades que pertenecen al canal deberán contener algún valor antes de iniciar el canal con la función IniciarCanal así mismo las

Las propiedades que forman parte del artículo deberán ser llenadas antes de llamar a la función EscribirArticulo

La función CerrarCanal se la usará como última instrucción ya que la tarea de esta es cerrar el XML que se esta generando en memoria, entiéndase por cerrar a completar los tags de cierre de todos aquellos tags que no lo tengan.

Bueno con esto estamos listos, ahora se preguntaran donde esta el XML? Bueno muy fácil el archivo XML se genera en memoria y será devuelto al cliente a través de una página ASPX que será la encargada de ponerle los datos, esta clase solo se encarga de la estructura del archivo y no lo hace persistente (no se crea un archivo con extensión .XML).

Por que tome este enfoque? Sencillo por que de esta manera pueden guardar las noticias y toda la información del canal en una base de datos (con el motor de base de datos que ustedes vean conveniente) es por eso que los constructores (funciones new) reciben como parámetro un objeto Stream, esto nos permite generar el archivo y enviarlo al cliente al momento de solicitar el ASPX y la forma de llenar el canal es muy fácil.


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Page.Response.ContentType = "text/xml"
Dim rss As New MiGeneradorRSS(Page.Response.Output)
With rss
'pasar los valores a las propiedades antes de iniciar el canal
.TituloCanal = "Mi Canal con Mi clase"
.LinkCanal = "http://www.carnal.com"
.DescripcionCanal = "el super Canal de RSS"
.CopyRight = "Copyright © Canal inc."
.WebMaster = "Andres Ureña"
.Generador = "Andres Ureña"
.UltimaActualizacion = Today
.IniciarCanal()
'pasar los valores a las propiedades antes de escribir el articulo
.TituloArticulo = "Mi Primera Noticia"
.LinkArticulo = "http://www.canal.com/art.aspx?id=1"
.DescripcionArticulo = "esta es solo la primera de muchas"
.Autor = "Andres Ureña"
.FechaPublicacion = Today
.Contenido = "aquí viene el contenido del artculo"
.EscribirArticulo()
'cerrar el servicio
.CerrarCanal()
End With
End Sub


Una vez iniciado el canal puede generar un bucle en el que recorran una fuente de datos con la información sacada de la base de datos donde guardan la información (noticias) e ir llenando el RSS con estos datos, como el propósito de este artículo es solo mostrar la técnica solo introduciré una noticia y de manera directa.

Deben tener en cuenta que para que no les de error el ASPX no debe escribir nada de html, de lo contrario no funciona, para lograr esto deben borrar todo el contenido de la parte html del ASPX menos la directiva de la página.

Ahora pueden probar si el canal funciona al ejecutar el ASPX con el código de arriba les mostrara una página ASPX con contenido XML como la imagen 1.

Como leer una suscripción RSS
He creado basado en el RSS que se genera con esta clase un cliente que lee la suscripción y la muestra de manera un poco más amigable.

La idea de este “cliente” por así decirlo, es que no se tenga que estar creando una interfaz complicada para el manejo del RSS es por eso que les presento el siguiente código.

Este cliente se compone de 2 partes la primera es un Web control que es el que maneja la lógica de la interpretación del canal RSS y una presentación visual para acceder a las noticias en este contenidas a través del enlace o link que las noticias tienen como referencia.

La segunda parte es solo un formulario Web donde esta alojado el Web control. Como verán en un momento esto es sumamente sencillo de implementar y por favor siéntanse libres de modificar el código y experimentar con el.


<%@ Control Language="VB" AutoEventWireup="false" CodeFile="RSSFeed.ascx.vb" Inherits="RSSFeed" %>
<%@ OutputCache Duration="3600" VaryByParam="None" %>

<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table border=0 style="width: 240px; font-size: x-small; color: black; font-family: Verdana;">
<thead>
<tr style="font-weight: bold;">
<td><%#Me.Title%></td>
</tr>
<tr style="font-style: italic;">
<td><%#Me.Description%></td>
</tr>
</thead>
</HeaderTemplate>
<ItemTemplate>
<tr bgcolor="LightBlue" >
<td>
<a target="article" style="text-decoration: none; color: black;" href=<%# DataBinder.Eval(Container.DataItem, "link") %>>
<%# DataBinder.Eval(Container.DataItem, "title") %> </a>
</td>
</tr>
<tr bgcolor="Ivory">
<td style="color: CornFlowerBlue;">
<%# DataBinder.Eval(Container.DataItem, "description") %>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>



Notaran que se esta haciendo uso de un control Repeater para mostrar todo el contenido de la tabla de artículos para este fin se ha creado una tabla html dentro del Template del Repeater que permitirá organizar mejor la información. Esta tabla tiene como cabecera la información del canal y en el contenido en si tiene una lista de los artículo que se dividen en dos partes, el titulo del artículo y la descripción del mismo, el titulo sirve como enlace a link del artículo.

Para que este Repeater se cargue de manera apropiada deberá tener en el code behind el siguiente código.


Imports System.Net
Imports System.Data
Partial Class RSSFeed
Inherits System.Web.UI.UserControl
Public Title As String
Public Description As String
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim rssFeed As HttpWebRequest = DirectCast(WebRequest.Create("http://pajarito/rssfeed/rss.aspx"), HttpWebRequest)
Dim rssData As DataSet = New DataSet()
rssData.ReadXml(rssFeed.GetResponse().GetResponseStream())
Dim channelItems As Object() = rssData.Tables(1).Rows(0).ItemArray
Dim titleColumn As Integer = rssData.Tables(1).Columns("title").Ordinal
Dim descriptionColumn As Integer = rssData.Tables(1).Columns("description").Ordinal
Title = channelItems.GetValue(titleColumn).ToString()
Description = channelItems.GetValue(descriptionColumn).ToString()
Repeater1.DataSource = rssData.Tables(2)
Repeater1.DataBind()
End Sub
End Class


Como se puede advertir se esta usando la clase HttpWebrequest para solicitar ya sea el archivo XML, RSS o ASPX que nos provee de la suscripción, en el código esta haciendo referencia a mi servidor así que deberán modificar ese parámetro para que funcione.

Ahora para no estar complicándonos mas la vida solo debemos arrastrar el WebControl que acabamos de crear y listo, tenemos un “cliente” de RSS que podrá leer la suscripción que creamos en la primera parte de este artículo.

Este tipo de servicios de noticias es muy útil en un sitio Web o aplicación Web si así se quiere, que se actualice con mucha frecuencia o que publique en su defecto noticias. Este es un importante avance en lo que muchos autores denominan “Informática centrada en el humano
 
Imagen 1

 
   
   
   
  Últimos comentarios  
 
Emilio - silencioweb@hotmail.com (06/10/2009 8:09:38)
Para que funcione en IE, hay que reemplazar .WriteStartAttribute("version", "2.0") por .WriteAttributeString("version", "2.0")


Jim Saenz - jsaenz@udep.edu.pe (25/04/2007 0:49:40)
Hola Marco

Probe el codigo, pero me sale el siguiente error: Only one top level element is allowed in an XML document. Error processing resource 'http://localhost/SuscriptorRSS/WebForm...



Esto pertenece al archivo ascx, justo en la vista HTML donde insertas el repeater.

Todo lo que indicas en tu tutorial, lo he realizado, pero cuando ejecuto el formulario web donde esta insertado el web user control (repeater) sale este mensaje de error, pero lo curioso es que si ves el codigo de esta pagina y lo copias y lo pegas en un archivo con extension htm. se puede conseguir ver las noticias colocadas en una tabla y en la parte superior el codigo rss.

Por favor, me podrias ayudar a determinar por que sale ese error.

Un abrazo.

Jim Saenz
Peru


jimena - lijigoes@hotmail.com (03/09/2006 20:25:25)
mas o menos, creo que te falta algo




[+] comentarios
 
   Comentar el artículo.  
 
 
Pon tú nombre, email y tu comentario.

El comentario sera validado por el equipo de netveloper y posteriormente publicado así que no te molestes en dejar spam.  

 
Por favor no pongáis preguntas o dudas aquí, para las dudas tenéis los FOROS, en la sección comentarios solo publicare comentarios al artículo, cualquier duda pregunta la ponéis en los FOROS.

  Nombre:
  
  E-mail:
  
  Comentario:
  

  

 
 


Google

Todos los contenidos de este Web son propiedad de sus respectivos autores, queda prohibida su copia o difusión sin la autorización expresa.

ethek.com | canaljuegos.com | patatastraigo.com | altersem.com |