最近,我爲ASP.NET應用程序創建了一個RSS提要生成器。首先,你從XmlWriter
派生。然後,您創建將託管供稿的頁面。你去:
public enum RssElements
{
Rss, Channel, Title, Description, Link, Copyright, Generator, Item, PubDate
}
public enum RssAttributes
{
Version
}
/// <summary>
/// RSS writer that emits RSS feeds.
/// </summary>
public class RssWriter : XmlWriter
{
private XmlWriter writer;
private Stream objStream;
#region Constructor
public RssWriter (Stream stream)
{
objStream = stream;
writer = XmlWriter.Create (objStream);
}
#endregion
#region Stream Related Operations
public override void Close()
{
objStream.Close();
writer.Close();
}
public override void Flush()
{
writer.Flush();
}
#endregion
#region Writing Elements
public void WriteStartElement (RssElements element)
{
string elementName = "";
switch (element)
{
case RssElements.Channel:
elementName = "channel";
break;
case RssElements.Copyright:
elementName = "copyright";
break;
case RssElements.Description:
elementName = "description";
break;
case RssElements.Generator:
elementName = "generator";
break;
case RssElements.Item:
elementName = "item";
break;
case RssElements.Link:
elementName = "link";
break;
case RssElements.PubDate:
elementName = "pubDate";
break;
case RssElements.Rss:
elementName = "rss";
break;
case RssElements.Title:
elementName = "title";
break;
}
writer.WriteStartElement (elementName);
}
public void WriteElementString (RssElements element, string value)
{
string elementName = "";
switch (element)
{
case RssElements.Channel:
elementName = "channel";
break;
case RssElements.Copyright:
elementName = "copyright";
break;
case RssElements.Description:
elementName = "description";
break;
case RssElements.Generator:
elementName = "generator";
break;
case RssElements.Item:
elementName = "item";
break;
case RssElements.Link:
elementName = "link";
break;
case RssElements.PubDate:
elementName = "pubDate";
break;
case RssElements.Rss:
elementName = "rss";
break;
case RssElements.Title:
elementName = "title";
break;
}
writer.WriteElementString (elementName, value);
}
public override void WriteEndElement() { writer.WriteEndElement(); }
#endregion
#region Writing Attributes
public void WriteStartAttribute (RssAttributes attb)
{
if (attb == RssAttributes.Version)
{
writer.WriteStartAttribute ("version");
}
}
public void WriteAttributeString (RssAttributes attb, string value)
{
if (attb == RssAttributes.Version)
{
writer.WriteAttributeString ("version", value);
}
}
public override void WriteEndAttribute() { writer.WriteEndAttribute(); }
#endregion
#region Writing Data
public override void WriteCData (string text) { writer.WriteCData (text); }
public override void WriteChars (char [] buffer, int index, int count) { writer.WriteChars (buffer, index, count); }
public override void WriteComment (string text) { writer.WriteComment (text); }
public override void WriteWhitespace (string ws) { writer.WriteWhitespace (ws); }
public override void WriteString (string text) { writer.WriteString (text); }
#endregion
#region Document
public override void WriteStartDocument() { writer.WriteStartDocument(); }
public override void WriteStartDocument (bool standalone) { writer.WriteStartDocument (standalone); }
public override void WriteEndDocument() { writer.WriteEndDocument(); }
#endregion
#region Not Implemented Methods
void ThrowException() { throw new Exception ("The method or operation is not implemented."); }
public override string LookupPrefix (string ns) { ThrowException(); return ""; }
public override void WriteBase64 (byte [] buffer, int index, int count) { ThrowException(); }
public override void WriteCharEntity (char ch) { ThrowException(); }
public override void WriteStartElement (string prefix, string localName, string ns) { ThrowException(); }
public override WriteState WriteState
{
get { throw new Exception ("The method or operation is not implemented."); }
}
public override void WriteSurrogateCharEntity (char lowChar, char highChar) { ThrowException(); }
public override void WriteEntityRef (string name) { ThrowException(); }
public override void WriteFullEndElement() { ThrowException(); }
public override void WriteProcessingInstruction (string name, string text) { ThrowException(); }
public override void WriteRaw (string data) { ThrowException(); }
public override void WriteRaw (char [] buffer, int index, int count) { ThrowException(); }
public override void WriteStartAttribute (string prefix, string localName, string ns) { ThrowException(); }
public override void WriteDocType (string name, string pubid, string sysid, string subset) { ThrowException(); }
#endregion
}
然後你創建主機頁面。這是一個空白頁面;所有的工作都在Page_Load事件中完成。下面我給你一個Page_Load事件。注意:您可以用業務對象替換數據庫對象。
protected void Page_Load (object sender, EventArgs e)
{
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.ContentType = "text/xml";
RssWriter writer = new RssWriter (Response.OutputStream);
writer.WriteStartElement (RssElements.Rss);
writer.WriteAttributeString (RssAttributes.Version, "2.0");
writer.WriteStartElement (RssElements.Channel);
writer.WriteElementString (RssElements.Title, "XYZ corp.com");
writer.WriteElementString (RssElements.Link, "http://www.yourdomain.com");
writer.WriteElementString (RssElements.Description, "Latest news from XYZ corp");
writer.WriteElementString (RssElements.Copyright, "Copyright (C) XYZ corp. All rights reserved.");
writer.WriteElementString (RssElements.Generator, "XYZ corp XML RSS Generator");
DataTable newsTable = NewsAccess.GetLatestNewsByDate (false);
if (newsTable.Rows.Count > 0) {
for (int i = 0; i < newsTable.Rows.Count; ++i)
{
string id = newsTable.Rows [i] ["LatestNewsID"].ToString();
string subject = newsTable.Rows [i] ["Subject"].ToString();
string description = newsTable.Rows [i] ["Description"].ToString();
bool publicView = newsTable.Rows [i] ["PublicView"].ToString() == "True" ? true : false;
if (!publicView)
continue;
//string details = newsTable.Rows [i] ["Details"].ToString();
DateTime dt = DateTime.Parse (newsTable.Rows [i] ["DateCreated"].ToString());
string date = dt.ToString ("R");
writer.WriteStartElement (RssElements.Item);
writer.WriteElementString (RssElements.Title, subject);
writer.WriteElementString (RssElements.Link, "http://www.yourdomain.com/Contents/News/newsarticle.aspx?id=" + id.ToString());
writer.WriteElementString (RssElements.Description, description);
writer.WriteElementString (RssElements.PubDate, date);
writer.WriteEndElement();
}
}
writer.WriteEndElement();
writer.WriteEndElement();
writer.Close();
Response.End();
}
我希望它有所幫助。
我喜歡它。我不熟悉RSS的生成,這可能是一個愚蠢的問題,但它是否會給某些RSS閱讀器帶來問題,因爲它沒有指定XML名稱空間?當我查看RSS示例時,我經常看到http://www.xml.com/pub/a/2002/12/18/dive-into-xml.html中鏈接的命名空間。有時,例如,我的Firefox「直播書籤「將無法識別簡化種類的Feed。我很想知道您是否針對廣泛的讀者使用這種或者特定的讀者? – 2010-03-25 16:44:23
您可以向作者添加命名空間:http://msdn.microsoft.com/en-us/library/cfche0ka.aspx – ScottE 2010-03-25 19:09:08