RSS feed
@
viernes, 10 de septiembre de 2010 | 2:15:48 (UTC) |
jtsoft.org> weblog>2007>04>03>mejorando-el-rss-feedSkip Navigation Links

Mejorando el RSS feed Volver al Blog


http://feedvalidator.org/

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:creatorcategory 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:

No hay comentarios



Hacer comentario:

Nombre:  
Email:   
URL:  
Comentario:  
Entradas recientes
Mis imágenes en flickr
Etiquetas
Mis sitios
Recursos
Archivo