Mejorando el RSS feed
Como ya dije en Nuevas funciones: Comentarios y RSS, desde hace unos días está en funcionamiento el RSS feed de jtsoft.org. La verdad es que apenas decía nada de RSS, en realidad solo mencionaba que en aspnet.4guysfromrolla.com hay una excelente explicación para hacer un RSS feed usando ASP.net. Utilizando como base la información y el código de esa página, he hecho unas mejoras y añadido algunas funciones a mi feed.
Las mejora más importante es la utilización de una hoja de estilos XSLT que transforma el contenido XML en XHTML para que se pueda ver en un navegador web. Para mejorar un poco el rendimiento del acceso a datos he sustituido la DataTable por un SqlDataReader. Y por último he añadido los elementos guid, dc:creator, category y comments al código XML del feed; los dos primeros para validar el feed conforme a RSS 2.0 y los dos últimos para insertar las etiquetas y un enlace a los comentarios de las entradas.
La página que genera el código XML conforme al formato RSS 2.0, no contiene ningún control ni ninguna etiqueta HTML, solo esta línea:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Rss20.aspx.cs" Inherits="Feeds_Rss20" %>
El código en C# de la página es éste:
using System; using System.Data; using System.Configuration; using System.Collections; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.IO; using System.Xml; using System.Text; using System.Data.SqlClient; using System.Web.Configuration;
public partial class Feeds_Rss20 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Response.ContentType = "text/xml"; Response.ContentEncoding = Encoding.UTF8; //si no esta en cache volver a crear el feed if (Cache["RssFeed"] == null) { StringWriter sw = new StringWriter(); XmlTextWriter writer = new XmlTextWriter(sw); writer.Formatting = Formatting.Indented; //cabecera del archivo XML writer.WriteProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\""); //Aplicar un XSL stylesheet writer.WriteProcessingInstruction("xml-stylesheet", "type='text/xsl' href='http://www.jtsoft.org/xslt/rss.xsl' version='1.0'"); writer.WriteComment("generator=\"jtsoft/2007\""); //El feed comienza con el elemento "rss" writer.WriteStartElement("rss"); writer.WriteAttributeString("version", "2.0"); writer.WriteAttributeString("xmlns:dc", "http://purl.org/dc/elements/1.1/"); //Abrir un elemento "channel" writer.WriteStartElement("channel"); writer.WriteElementString("title", "JTsoft.org, Blog sobre Asp.net"); writer.WriteElementString("link", "http://www.jtsoft.org/"); writer.WriteElementString("description","Descripcion del RSS feed..."); writer.WriteElementString("generator", "http://www.jtsoft.org/"); writer.WriteElementString("language", "es"); writer.WriteElementString("ttl", "5"); // obtener los articulos del blog mediante un SqlDataReader SqlDataReader reader; string connectionString = WebConfigurationManager.ConnectionStrings["myConn"].ConnectionString; SqlConnection myCon = new SqlConnection(connectionString); SqlCommand myCommand = new SqlCommand("Feed_select", myCon); myCommand.CommandType = CommandType.StoredProcedure; try { myCon.Open(); reader = myCommand.ExecuteReader(); while (reader.Read()) { //para cada articulo se añade un elemento "item" writer.WriteStartElement("item"); writer.WriteElementString("title", reader.GetString(0)); writer.WriteElementString("link", reader.GetString(1)); //no poner código HTML en la descripcion writer.WriteElementString("description", reader.GetString(2)); writer.WriteElementString("dc:creator", reader.GetString(3)); writer.WriteElementString("pubDate", reader.GetDateTime(4).ToString("r")); //insertar un elemento "category" por cada etiqueta string[] tags= GlobalData.Tags_select(reader.GetInt32(5)).Split(','); foreach (string tag in tags) { writer.WriteElementString("category", tag.Trim()); } //comentarios writer.WriteElementString("comments", reader.GetString(1)+"#comentarios"); //guid->RSS validate //writer.WriteStartElement("guid"); writer.WriteStartElement("guid"); writer.WriteAttributeString("isPermaLink", "false"); writer.WriteString(reader.GetString(1)); //writer.WriteElementString("isPermaLink", "true"); //cerrar "guid" writer.WriteEndElement(); //cerrar "item" writer.WriteEndElement(); } reader.Close(); } finally { myCon.Close(); } //cerrar "channel" writer.WriteEndElement(); //cerrar "rss" writer.WriteEndElement(); //Guardar el Rss feed en cache Cache.Insert("RssFeed", sw.ToString(), null, DateTime.Now.AddMinutes(1), TimeSpan.Zero); writer.Close(); } //la pagina muestra el Rss feed guardado en cache Response.Write(Cache["RssFeed"].ToString()); } }
El archivo XSLT que transforma el contenido XML en XHTML se puede ver aquí.
Publicado:
martes, 03 de abril de 2007
11:32:45
por
jtsoft
Etiquetas:
ASP.net
,
jtsoft.org
,
RSS
,
XML
,
XSLT
Comentarios:
Hacer comentario:
|