次の方法で共有


Generating an RSS feed with XmlSerializer, ASP.NET and C#

I wanted to play around with creating a simple RSS feed from an ASP.NET page. I looked around for existing solutions. Any searches involving RSS are a bit hopeless, but I found Jason Salas’ RSS server control. It’s nice because you can easily hook it up to a SQL source. I didn’t need that though, and I didn’t really like the idea of creating the XML by hand, especially since there’s such a nice XmlSerializer. So, I put together a simple solution using an XmlSerializer. As a disclaimer, I haven’t really dug into the Rss specifications in detail, and this probably isn’t valid RSS. But, it may serve as a good starting point for someone else.

 

To start with, we define classes for each of the different elements with the attributes necessary for XmlSerializer to spit out the right XML:

 

[XmlRoot("rss")]

public class Rss

{

    [XmlAttribute]

    public string version = "2.0";

    public Channel channel = new Channel();

}

[XmlRoot("channel")]

public class Channel

{

    public string title;

    public string link;

    public string description;

    [XmlElement]

    public List<Item> item = new List<Item>();

}

public class Item

{

    public string title;

    public string link;

    public string guid;

    public string description;

}

 

I only included a few of the possible properties for channels and items. Adding the others is pretty straightforward. If you add a field and don’t set a value, it won’t generate any XML. The only slightly complex one would be the publication date fields because they are supposed to be in RFC822 format, and I don’t know of a built in function to format DateTimes to that format, although I see there is one here.

 

To use this from an ASP.Net page, you’ll first want to create a basically blank page (note: this is the latest Whidbey syntax):

 

<%@ Page Language="C#" CompileWith="Default.aspx.cs" ClassName="Default_aspx" %>

 

Then, in the codebehind file:

 

[Insert all the usings you need here]

 

public partial class Default_aspx

{

    protected void Page_Load(object sender, EventArgs e)

    {

        Response.ContentType = "text/xml;charset=utf-8";

        Rss feed = new Rss();

        // Set up channel parameters

        feed.channel.title = "Test feed";

        feed.channel.link = "https://blogs.msdn.com/dancre";

        feed.channel.description = "Simple feed using XmlSerialization";

        // Add some items

        Item item1 = new Item();

        item1.title = "item 1";

        item1.description = "item 1 description";

        item1.guid = "something unique 1";

        feed.channel.item.Add(item1);

        Item item2 = new Item();

        item2.title = "item 2";

        item2.description = "item 2 description";

        item2.guid = "something unique 2";

        feed.channel.item.Add(item1);

// Serialize Xml to output stream

XmlSerializer serializer = new XmlSerializer(typeof(Rss));

serializer.Serialize(Response.OutputStream, feed);

    }

}

 

Updated to not use memory stream, but just output to response. Thanks, Matt!

Comments

  • Anonymous
    December 13, 2004
    Hi, Dan: Guess you didn't Google for "rss vb.net" or you would have found this: http://www.philweber.com/articles/easy_rss_in_vbnet.htm ;-)
  • Anonymous
    December 13, 2004
    Oh well :-)
  • Anonymous
    December 13, 2004
    XmlSerializer serializer = new XmlSerializer(typeof(Rss));
    serializer.Serialize(Response.OutputStream, feed);
  • Anonymous
    December 13, 2004
    ms.Position = 0; //I think you need to reset the start position of the MemoryStream

    byte[] buffer = new byte[1024];

    int count;
    do
    {
    count = xmlOutput.Read(buffer,0,buffer.Length);
    Response.Output.Write(buffer,0,count);
    }while(count > 0);

    I must have written that code one too many times. I remember the right order of the parameters.

    Don't forget to Dispose of the MemoryStream.
  • Anonymous
    December 14, 2004
    The comment has been removed
  • Anonymous
    January 05, 2005
    Quite a cool code. it helped me a lot. i can serilize the objects, now i want to Deserlize the data i receive at the other end