Tu Lector RSS en 5 minutos

Pues estaba yo pensando que ya era hora de publicar algo nuevo en el Blog, que entre historia e historia lo tengo algo abandonado, así que voy a mostrar un mini tutorial que hice hace unos meses sobre como crear un lector RSS en 5 minutejos de reloj 🙂 Decir que lo que expongo a continuación es la base más básica de como empezar con el lector, como se puede suponer, luego se podrá complicar infinitamente más:

1º Introducción a RSS y su extensabilidad

RSS es parte de la familia de los formatos XML desarrollado específicamente para todo tipo de sitios que se actualicen con frecuencia y por medio del cual se puede compartir la información y usarla en otros sitios web o programas. A esto se le conoce como sindicación.

El acrónimo se usa para los siguientes estándares:

• Rich Site Summary (RSS 0.91)
• RDF Site Summary (RSS 0.9 and 1.0)
• Really Simple Syndication (RSS 2.0)

Los programas que leen y presentan fuentes RSS de diferentes procedencias se denominan agregadores.
Gracias a los agregadores o lectores de feeds (programas o sitios que permiten leer fuentes RSS) se puede obtener resúmenes de todos los sitios que se desee desde el escritorio de tu sistema operativo, programas de correo electrónico o por medio de aplicaciones web que funcionan como agregadores. No es necesario abrir el navegador y visitar decenas de webs.

Pero lo verdaderamente importante es que a partir de este formato se está desarrollando una cadena de valor nueva en el sector de los contenidos que está cambiando las formas de relación con la información tanto de los profesionales y empresas del sector como de los usuarios.

Así pues, atendiendo a esto ahora mismo podrías leer las noticias de geeks.ms en tu nevera si esta tuviera conexión a Internet (cosa que empezará a ser habitual en los tiempos que corren), y el lector que crearemos más adelante incorporado.

2º Web Request

Realiza una solicitud a un identificador de recursos uniforme (URI). Esto es una clase abstracta MustInherit en Visual Basic. Esto quiere decir que WebRequest es la clase base del modelo de solicitud/respuesta .NET Framework para tener acceso a datos desde Internet. Una aplicación que utilice el modelo de solicitud/respuesta puede solicitar datos de Internet de una manera que sea válida para los protocolos, donde la aplicación trabaja con instancias de la clase WebRequest mientras que las clases descendientes específicas del protocolo se encargan de los detalles de la solicitud.
Las solicitudes se envían desde una aplicación a un identificador URI concreto, como una página Web de un servidor. El identificador URI determina la clase descendiente adecuada que se debe crear a partir de una lista de descendientes de WebRequest registrados para la aplicación. Los descendientes de WebRequest suelen registrarse para controlar un protocolo específico, como HTTP o FTP, pero se pueden registrar para controlar una solicitud a un servidor específico o una ruta de acceso en éste.

3º WebResponse

La clase WebResponse es la clase base (MustInherit en Visual Basic) a partir de la cual se derivan las clases de respuesta específicas del protocolo. Las aplicaciones pueden participar en transacciones de solicitud y respuesta de un modo que sea válido para protocolos utilizando instancias de la clase WebResponse mientras las clases específicas del protocolo derivadas de WebResponse se encargan de los detalles de la solicitud.

Es importante destacar que las aplicaciones cliente no crean objetos WebResponse directamente, sino mediante una llamada al método GetResponse en una instancia de WebRequest.

4º Propiedades Proxy del objeto WebRequest

Según realizaba la aplicación, me ví con un problema, y es que inexplicablemente no conseguía acceder al archivo XML remoto. Bien, tras darle unas cuantas vueltas me percaté de que estaba bajo un proxy de filtrado de usuarios de dominio. Esto es, que para salir a internet antes pasas por un proxy que comprueba los datos de la conexión saliente, y si la autentificación es válida, permite la salida de la conexión.
Por lo tanto primer requisito, tener acceso a internet. Lo curioso de este sistema es que tu, estando autentificado en tu máquina a la vez q en un posible dominio, cuando te conectas a internet la autentificación que haces al proxy es automática, mientras que para poder acceder desde esta aplicación tendrás que mandarle las credenciales para esa autentificación manualmente.
Y esto como se hace te preguntarás, pues basta con echarle un vistazo a las propiedades del objeto WebRequest que usamos para hacer la petición remota, entre ellas encontramos la propiedad Proxy, que será la que usaremos para decirle a nuestro amado Proxy quienes somos. Para ello escribiremos:

Dim req As WebRequest = WebRequest.Create(“dirección del xml”)
req.Proxy = New WebProxy(“dirección del proxy:8080”)
req.Proxy.Credentials = New NetworkCredential(“usuario”, “password”)

Como podemos ver, nos creamos una instancia del objeto WebRequest pasándole la dirección remota en la que se encontrará la ubicación del .XML, y después a la propiedad Proxy de dicha instancia le pasaremos la dirección del Proxy y las Credenciales de red, es decir el usuario y el password que debe tener permiso de salida.

Por supuesto si no estuviéramos bajo ningún Proxy este código no tendríamos pq emplearlo 😛

5º Código

Imports System.Xml
Imports System.Xml.Xsl
Imports System.Net
Imports System.IO

Partial Class _Default
Inherits System.Web.UI.Page

Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load

Dim midataset As New Data.DataSet
Dim req As WebRequest = WebRequest.Create(“dirección RSS remota”)

‘En el caso de que tengamos proxy
‘********************************
‘req.Proxy = New WebProxy(“dirección del proxy:8080”)
‘req.Proxy.Credentials = New NetworkCredential(“user”, “pass”)
‘********************************

Dim miResponse As WebResponse = req.GetResponse()
midataset.ReadXml(miResponse.GetResponseStream)
miResponse.Close()


Dim memStream As Stream = New MemoryStream()
Dim xmlDocument As XmlDataDocument = New XmlDataDocument(midataset)

Dim xslTran As XslCompiledTransform = New XslCompiledTransform
xslTran.Load(Server.MapPath(“PlantillaXML.xsl”))

Dim writer As XmlTextWriter = New XmlTextWriter(memStream, System.Text.Encoding.UTF8)

xslTran.Transform(xmlDocument, Nothing, writer)

memStream.Position = 0

Dim sr As StreamReader = New StreamReader(memStream)

Dim line As String
Do
line = sr.ReadLine()
‘Visualizamos el resultado en una simple label..
Label1.Text += ” ” + line
Loop Until line Is Nothing
sr.Close()
writer.Close()

End Sub
End Class



PlantillaXML.xsl:

<?xml version=”1.0″ encoding=”iso-8859-1″?>
<xsl:stylesheet version=”1.0″
xmlns:xsl=”
http://www.w3.org/1999/XSL/Transform
xmlns:rdf=”
http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns:rss=”
http://purl.org/rss/1.0/“>
<xsl: output method=”html”/>
<xsl:template match=”channel”>
<html>

<xsl:for-each select=”item”>

<table>
<tr>
<td>
</td>
<td>
<a href=”{link}” mce_href=”{link}” target=”Blank”>
<xsl:value-of select=”title”/>
</a>
</td>
</tr>
</table>
</xsl:for-each>

</body>
</html>
</xsl:template>
</xsl:stylesheet>

6º Bibliografía

No habría sido posible realizar esta mini-guia si no fuera por la como siempre buena información de:

http://www.w3.org/TR/xslt


Kiches

7 thoughts on “Tu Lector RSS en 5 minutos

  1. Hola Isaac, sería posible que enumeres los pasos, en forma más sencilla, para incluir un lector RSS en un sitio web?? No tengo mucho conocimiento de códigos y necesito un método como “RSS para tontos. Podría ser algo como 1) Crear una página con terminación “xml”. 2) Pege este código en el encabezado de la página (o donde sea), etc. etc.”, te lo agradecéría

  2. Hola Isaac. Muy bueno este post. Después de un par de intentos fallidos para implementar algo parecido me ha sido de gran ayuda… Sólo tengo una cuestión: ¿has intentado cargar el archivo Xsl desde una ruta externa a tu servidor al igual que se está haciendo con el Xml? He intentado hacerlo de una forma similar a como estás cargando el Xml pero me salta una excepción con el siguiente mensaje “System.Xml.Xsl.XslLoadException: La hoja de estilo debe comenzar con un elemento ‘xsl:stylesheet’ o ‘xsl:transform’, o con un elemento de resultado literal que tenga un atributo ‘xsl:version’, donde el prefijo ‘xsl’ denote el espacio de nombres ‘http://www.w3.org/1999/XSL/Transform”. Sin embargo sé que el contenido de este archivo es correcto porque ejecutar “xslTran.Load(“http://localhost/archivoXsl.xsl”)” no provoca error.
    Muchas gracias de antemano por tu atención.
    Un saludo.

  3. Hola Sergio, lo mas probable es que no estes accediendo al archivo remoto por temas de seguridad. Es posible que estes teniendo problemas de permisos, a la hora de acceder a dicho recurso. Dicho esto, me surgen varias dudas, donde está el servidor remoto ?, estas en el mismo dominio ?, tienes autenticación windows? forms? algún proxy?…

  4. Hola Isaac.
    Pues sí, como te comentaba estoy atravesando un proxy.
    El caso es que, como te decía, el código que nos muestras me funciona a la perfección, es decir, que consigo atravesar mi proxy para acceder a la fuente Xml y el fichero Xsl, que en este caso estoy cargando desde mi propio servidor, es accedido y cargado correctamente.
    Ahora el problema lo tengo porque el Xsl también se va a encontrar fuera. Así, la prueba la he iniciado cogiendo el fichero Xsl que tengo en mi propio servidor y poniéndolo en un servidor externo. Después modifico el código para cargar el Xsl en un objeto de la clase XmlDataDocument (como hicimos antes con el Xml) y hacer la llamada a “Load” con este objeto. Esta llamada (al método “Load”) es la que provoca el error que te comentaba en el comentario anterior…
    No sé si he conseguido aclarar algo…
    Muchas gracias otra vez.
    Un saludo.

  5. Hola de nuevo Sergio, el problema es que no consigues llegar al servidor en el que tienes alojado el .xsl lo que produce que te falle el método load, y los motivos pueden ser muchos…

    Para empezar debrías mirar si el servidor donde dejas el xsl está en el mismo dominio, que el servidor donde estas ejecutando la aplicación que tiene el load, de ser así, comprueba que tengas desabilitado el acceso anónimo, y que el usuario con el que corres la aplicación que lo llama, tiene permisos en el directorio en el que tienes el xsl.

Leave a Reply

Your email address will not be published. Required fields are marked *