· tech · 4 min read
ASP.NET下生成和读取RSS
前段时间看msdn的教程了解了用xpath读取rss,或者用xsl来规范。前者的问题是局限性比较大只能读取全部内容不能customize,要是碰到rdf的就更要命了,而后者的问题是太复杂,google上虽然有很多code但是懒得看。
抓取XML来生成RSS
最近要做project,需要做rss。不得不完全的研究一下RSS了,发现现在asp.netRSS Toolkit这个东西,超级好用,但是只能够读取外部的RSS。不过部署有点不方便。需要把压缩包里面的RssToolkit.dll文件,放到GAC里面。(用gacutil –i RssToolkit.dll这条命令,不过我的msdos一开始却不认这个gacutil, 于是把这个找了出来,我的是在Microsoft Visual Studio 8\SDK\v2.0\Bin下面的,版本不同的vs可能稍微有不同)。搞定以后进入VS里面,在Toolbox里右击选择Choose Item,然后browser前面那个RssToolkit.dll文件。这样这个超级好用的rss toolkit就安装完成了。
通过网站内容生成RSS
不过这个东西却不是我想要的东西,研究了很久发现RSS toolkit无法读取网站的数据库或者页面内容来生成RSS。
勘误一下,RSS toolkit是可以根据数据库内容来生成rss的,下载包里面的例子5就是这样的,不过需要手动建loop, 好像不能绑到datalist,repeater什么的。
于是又google了很久,期间被一篇《为自己的网站添加RSS功能》的技术文章QJ了n遍,国内这种文章真是一大抄啊,而且没有啥技术含量。还是Scott那个老头牛,发现了他的一篇文章。很精彩,不过最后用的还是他的事例code. 直接放自己的网页上,稍微改改数据绑定就能用了。
程序代码
// Set the content-type
Response.ContentType = “text/xml”;
Response.ContentEncoding = Encoding.UTF8;
// check to see if a cached version exists
if (Cache[“RssFeed”] == null)
{
// build up the cache dynamically
DataTable articleData = CreateDataSource();
// Use an XmlTextWriter to write the XML data to a string…
StringWriter sw = new StringWriter();
XmlTextWriter writer = new XmlTextWriter(sw);
// write out
writer.WriteStartElement(“rss”);
writer.WriteAttributeString(“version”, “2.0”);
// write out
writer.WriteStartElement(“channel”);
// write out -level elements
writer.WriteElementString(“title”, “Example RSS Feed Title”);
writer.WriteElementString(“link”, “http://myWebSite.com/”);
writer.WriteElementString(“description”,
“This is a demonstration RSS feed.”);
writer.WriteElementString(“ttl”, “60”);
// write out an element for each of the first X articles
const int RSS_ITEMS = 10;
for (int i = 0; i < RSS_ITEMS; i++)
{
// write out
writer.WriteStartElement(“item”);
// write out -level information
writer.WriteElementString(“title”,
articleData.Rows[i][“title”].ToString());
writer.WriteElementString(“link”,
String.Format(“http://myWebSite.com/article.aspx?id={0}”,
articleData.Rows[i][“articleID”]));
writer.WriteElementString(“description”,
articleData.Rows[i][“synopsis”].ToString());
writer.WriteElementString(“author”,
articleData.Rows[i][“author”].ToString());
// use DateTimeFormatInfo “r” to use RFC 1123
// date formatting (same as RFC 822)
writer.WriteElementString(“pubDate”,
((DateTime) articleData.Rows[i][“dateAdded”]).ToString(“r”));
// write out
writer.WriteEndElement();
}
// write out
writer.WriteEndElement();
// write out
writer.WriteEndElement();
// save the string in the cache (cache for 1.5 hours)
Cache.Insert(“RssFeed”, sw.ToString(), null,
DateTime.Now.AddHours(1.5), TimeSpan.Zero);
writer.Close();
}
// write out the cached value
Response.Write(Cache[“RssFeed”].ToString());
非常需要注意的是在前台的aspx页面里面需要删除部分,不然IE会出错。而在后台的cs文件里面需要调用System.Data, System.IO, System.Xml, System.Text.
为了尊重知识产权,给一下原文链接:Syndicating Your Web Site’s Content with RSS and ASP.NET