|
|
| |
| |
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. |
|
| |
|
|
|
|
|