Para empezar, una pequeña explicación sobre qué es RSS.
La cantidad de utilidades que se le han encontrado al lenguaje XML no deja de sorprenderme, y la de RSS en particular brinda una gran herramienta en estos tiempos en los que estamos rodeados de tantísima información, absolutamente inabarcable. Con nuestro software favorito podemos sindicar aquellas webs que nos interesan de modo que de un solo vistazo podamos ver si hay algo que nos interese e ir directo a ello, dejando de lado lo que no y evitando perder mucho tiempo navegando en busca de nuestro objetivo.
Hacer un documento RSS, por supuesto dinámico, en .NET, es sencillo una vez conocida la sintaxis, veamos como...
Para que el método sea lo más portable posible, vamos a segmentarlo todo en funciones. Por un lado, el evento donde se desencadenará la acción de crear el documento, que será el Page_Load, y dentro de este se llamará a 3 funciones, una que creará el encabezado, otra que irá añadiendo los elementos y una tercera que cerrará el documento.
Vamos con el evento:
private void Page_Load(object sender, System.EventArgs e) { //Declaramos el objeto XML (o escritor de XML) //donde crearemos el documento RSS 2.0 //******************************************** //Escribimos la cabecera del documento EscribirInicioRSS(Escritor); //************************************ //Añadimos los elementos. Aquà los he añadido 'a pelo', //sin embargo, lo suyo serÃa hacer un bucle que se repita //tantas veces como elementos queramos añadir y que //dichos elementos se obtengan de un DataSet de Base de Datos AddElementosRSS(Escritor,"<strong>TÃtulo 1</strong>",
"/index.html","Descripción 1 - Sin CDATA"); AddElementosRSS(Escritor,"<strong>TÃtulo 2</strong>",
"/articulos/index.html","Descripción 2 - Sin CDATA"); AddElementosRSS(Escritor,"<strong>TÃtulo 3</strong>",
"/principal.html","Descripción 3 - Con CDATA", true); AddElementosRSS(Escritor,"<strong>TÃtulo 4</strong>",
"/articulos/tutoriales/css/index.html","Descripción 4 - Con CDATA",
true); //*********************************************************** //Cerramos el documento RSS EscribirFinRSS(Escritor); //************************* //Volcamos el contenido en el objeto y lo cerramos Escritor.Flush(); Escritor.Close(); //************************************************ //Especificamos la codificación del //documento y habilitamos la caché Response.ContentEncoding = System.Text.Encoding.UTF8; Response.ContentType = "text/xml"; Response.Cache.SetCacheability(HttpCacheability.Public); //********************************* //Enviamos al cliente la salida del buffer Response.End(); //**************************************** }
Como se vé, y aunque el código ya está comentado, un breve resumen:
Vamos a ver estas 3 funciones, que son las que realmente construyen el documento (la explicación va en los comentarios de los propios códigos):
/// <summary> /// Escribe el principio de un documento RSS a un XmlTextWriter /// </summary> /// <param name="Escritor">El XmlTextWriter donde se escribirá</param> /// <returns>El XmlTextWriter con la información de cabecera ya escrita</returns> public XmlTextWriter EscribirInicioRSS(XmlTextWriter Escritor) { //Abrimos el documento Escritor.WriteStartDocument(); //******************** //Si se desea añadir un comentario al archivo RSS: Escritor.WriteComment("Comentario de prueba"); //************************************************ //El primer elemento a añadir será la declaración del RSS Escritor.WriteStartElement("rss"); Escritor.WriteAttributeString("version","2.0"); Escritor.WriteAttributeString("xmlns:blogChannel",
"http://backend.userland.com/blogChannelModule"); //******************************************************* //Definimos el elemento 'padre' Escritor.WriteStartElement("channel"); //***************************** //Si queremos añadir algún elemento inicial independiente //de los contenidos, como que web somos, copyright, etc: Escritor.WriteElementString("title",
"Documento RSS generado dinámicamente en .NET"); Escritor.WriteElementString("link",
"/articulos/tutoriales/net/index.html"); Escritor.WriteElementString("description",
"Un método para escribir documentos RSS en .NET con C#"); //******************************************************* //Devolvemos el objeto XML (RSS) con la cabecera ya escrita return Escritor; //********************************************************* }
/// <summary> /// Añade un elemento al XmlTextWriter pasado /// </summary> /// <param name="Escritor">El XmlTextWriter donde se escribirá</param> /// <param name="CadenaTitulo">El tÃtulo del elemento RSS</param> /// <param name="CadenaLink">La URL del elemento actual</param> /// <param name="CadenaDescrip">Descripción del elemento</param> /// <returns>El XmlTextWriter con el nuevo elemento escrito en él</returns> public XmlTextWriter AddElementosRSS(XmlTextWriter Escritor, string CadenaTitulo,
string CadenaLink, string CadenaDescrip) { //AbrÃmos un nuevo elemento Escritor.WriteStartElement("item"); //************************* //Añadimos los elementos hijos del actual objeto Escritor.WriteElementString("title",CadenaTitulo); Escritor.WriteElementString("link",CadenaLink); Escritor.WriteElementString("description",CadenaDescrip); Escritor.WriteElementString("pubdate", DateTime.Now.ToString("r")); //********************************************** //Cerramos el elemento Escritor.WriteEndElement(); //******************** //Devolvemos el objeto XML (RSS) con el elemento añadido return Escritor; //****************************************************** }
/// <summary> /// Añade un elemento al XmlTextWriter pasado /// </summary> /// <param name="Escritor">El XmlTextWriter donde se escribirá</param> /// <param name="CadenaTitulo">El tÃtulo del elemento RSS</param> /// <param name="CadenaLink">La URL del elemento actual</param> /// <param name="CadenaDescrip">Descripción del elemento</param> /// <param name="BoolDescriptCDATA">Escribe la descripción como CDATA</param> /// <returns>El XmlTextWriter con el nuevo elemento escrito en él</returns> public XmlTextWriter AddElementosRSS(XmlTextWriter Escritor, string CadenaTitulo,
string CadenaLink, string CadenaDescrip, bool BoolDescriptCDATA) { //AbrÃmos un nuevo elemento Escritor.WriteStartElement("item"); //************************* //Añadimos los elementos hijos del actual objeto Escritor.WriteElementString("title",CadenaTitulo); Escritor.WriteElementString("link",CadenaLink); //Si asà lo hemos especificado, la //descripción de añadirá como CDATA if (BoolDescriptCDATA == true) { Escritor.WriteStartElement("description"); Escritor.WriteCData(CadenaDescrip); Escritor.WriteEndElement(); } else { Escritor.WriteElementString("description",CadenaDescrip); } //********************************* Escritor.WriteElementString("pubdate", DateTime.Now.ToString("r")); //********************************************** //Cerramos el elemento Escritor.WriteEndElement(); //******************** //Devolvemos el objeto XML (RSS) con el elemento añadido return Escritor; //****************************************************** }
Si os fijais en el código del Page_Load. vereis que de las 4 llamadas que se hacen a esta función (AddElementosRSS()) , las 2 primeras tienen 4 parámetros, y las 2 siguientes tienen un quinto parametro de tipo booleano (true o false). Las llamadas con 4 parametros ejecutarán la primera 'Sobre Carga', que inserta un nuevo item de forma normal; si añadimos el quinto parámetro, y este es 'true', lo que haremos será que la descripción se escriba como CDATA, básicamente para que el XML no interprete ciertos caracteres como propios de su lenguaje y trate de ejecutarlos, es decir, para que escriba el texto tal y como está. Si utilizamos el quinto parametro pero lo especificamos a 'false' estaremos haciendo lo mismo que si llamásemos a la primera 'Sobre Carga'.
/// <summary> /// Finalmente, cerramos los elementos del RSS y el documento en sà /// </summary> /// <param name="Escritor">El XmlTextWriter donde se escribirá</param> /// <returns>El XmlTextWriter con todos los elementos cerrados</returns> public XmlTextWriter EscribirFinRSS(XmlTextWriter Escritor) { //Cerramos los elementos abiertos y el documento Escritor.WriteEndElement(); Escritor.WriteEndElement(); Escritor.WriteEndDocument(); //********************************************** //Devolvemos el objeto con todo el documento ya escrito return Escritor; //***************************************************** }
Simplemente, copiar y pegar el contenido del evento Page_Load y las 4 funciones, ya que si copiais los códigos de aquí os llevareis también el html, podeis copiarlo de aquí.
Y con esto hemos terminado, ya tenemos implementado en nuestra web un sistema RSS dinámico para que sindicalicen nuestros contenidos.
using System.IO; using System.Xml;