如何实现站点的RSS输出

关于Rss
 
RSS是共享内容的一种简易方式,也称聚合.通常被用于新闻和Blog。网站提供RSS输出,有利于让用户发现网站内容的更新。网站用户可以借助于支持RSS的新闻聚合工具软件或者在线网站(如BLOGLINES),订阅网站的内容并在不打开网站页面的情况下阅读内容。

RSS是基于XML的一种形式,具体规范我就不说了,下面是如何使用ASP.NET实现


通知浏览器网站提供了RSS输出:
把下面的这句放在博客或这站点的<head>标签中

<link id="RSSLink" title="RSS" type="application/rss+xml" rel="alternate" href="http://www.cnblogs.com/lbk/rss.aspx" />


创建RSS.ASPX文件
只留下面这一行,其余的都删掉。

<%@ Page language="c#" Codebehind="Rss.aspx.cs" AutoEventWireup="false" Inherits="Test.Rss" %>


后台代码;Rss.aspx.cs
这里XML文件内容的输出是采用直接输出字符串的形式,在我看来前者比较简单,你也可以使用XmlTextWriter来实现。

private void Page_Load(object sender, System.EventArgs e)
  
{    
    Response.ContentType
="text/xml";
    Response.Charset 
= "UTF-8";
    Response.Write(
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
    Response.Write(
"<rss version=\"2.0\"><channel>");

    Response.Write(GetUserRSS());   
    GetItemsRss();
 
    Response.Write(
"</channel></rss>");   
}

//此RSS的一些信息
private string GetUserRSS(Model.Users user)
    
{
        StringBuilder strRss 
= new StringBuilder();
        strRss.Append(
"<title>lbk</title>");
        strRss.Append(
"<link>lbk.cnblogs.com</link> ");
        strRss.Append(
"<description>呵呵,就是我</description> ");
        strRss.Append(
"<language>zh-cn</language>");
        strRss.Append(
"<generator>
lbk.cnblogs.com</generator>");
        
return strRss.ToString();
    }

//循环读取RSS中的每个ITEM的内容
private string getRss(IList<Model.Info> listInfo)
    
{
        StringBuilder strRss 
= new StringBuilder();
        
foreach (Model.Info var in listInfo)
        
{
            
string nickname = DAL.Users.instance.GetModelBasic(var.Author).NickName;
           
string content = var.Content;
            string link = Function.getConfig("MyUrl"+ nickname + "/blog/item/" + var.id;

            strRss.Append(
"<item>");
            strRss.Append(
"<title>" + Function.ReplaceXml(var.Title) + "</title>");
            strRss.Append(
"<author>" + nickname + "</author>");
            strRss.Append(
"<description><![CDATA[" + content + "<p><a href='" + link + "'>查看全文</a>" + "]]></description>");
            strRss.Append(
"<pubDate>" + var.Adddate.ToString() + "</pubDate>");
            strRss.Append(
"<link>" + link + "/</link>");
            strRss.Append(
"</item>");
        }

        
return strRss.ToString();
    }


XML中的特殊字符的过滤(否则生成的XML文件会出错):
public static string ReplaceXml(string msg)
    
{
        
if (msg != "" && msg != null)
        
{
            msg 
= msg.Replace("&""%26");
            msg 
= msg.Replace(">""&gt;");
            msg 
= msg.Replace("<""&lt;");
            msg 
= msg.Replace("\"""&quot;");
            msg = msg.Replace("'""&apos;");
        }

        
return msg;
    }

另外要注意的是,如果你的RSS输出的链接中又中文字符的话,
如: cnblogs.com/你好/rss.aspx,
最好能使用Server.UrlEncode("你好"),编码之后才能使用抓虾等订阅


posted on 2006-11-14 12:07 waitu 阅读(1138) 评论(15)  编辑 收藏 网摘 所属分类: A 技术学习

评论

#1楼  2006-11-30 11:15 huangzhong [未注册用户]

能发给我这个例子吗,我按照你的方式,结果总是不行。

hzyhh@sina.com   回复  引用    

#2楼 [楼主] 2006-11-30 15:26 WaitU(LBK,敢于直面惨淡的人生。。。)      

其实就是输出一个XML文件,
Response.ContentType="text/xml";
这是写文件头

这里贴出来的几乎就是全部的代码了,好好看看   回复  引用  查看    

#3楼  2006-12-06 16:18 juan [未注册用户]

不需要引用什么类吗?
  回复  引用    

#4楼 [楼主] 2006-12-07 09:12 WaitU(LBK,敢于直面惨淡的人生。。。)      

@juan
StringBuilder
using System.Text;
  回复  引用  查看    

#5楼  2007-05-20 14:11 hgj [未注册用户]

rss输出不需要控制输出内容的范围?象抓虾等工具,他们是如何判断item的新旧的?   回复  引用    

#6楼 [楼主] 2007-05-21 09:15 WaitU | 无地自容      

每个ITEM都有个唯一的pubDate节点,也就是文章发表的时间   回复  引用  查看    

#7楼  2007-12-15 10:47 张西 [未注册用户]

我有个问题就是这样按照第一种的方法,我生成这个页面后,然后订阅这个源,我再次调试程序,生成这个页面就不能运行到page_load里的程序代码,我觉得这个和订阅有关系,我是在本机运行的,但是假如这个效果的话,我就不能更新新的信息了,以为输出就只有这些新闻内容了.请指点一下
  回复  引用    

#8楼 [楼主] 2007-12-17 09:43 waitu      

@张西
没看懂。
就是在页面输出数据而已,应该不会有什么问题吧。   回复  引用  查看    

#9楼  2007-12-18 16:33 Vincent Luo      

<%@ Page language="c#" Codebehind="Rss.aspx.cs" AutoEventWireup="false" Inherits="Test.Rss" %>

创建RSS.ASPX文件
只留下面这一行,其余的都删掉

出现3个问题,你是怎么解决的?   回复  引用  查看    

#10楼 [楼主] 2007-12-18 19:13 waitu      

有什么问题?不可能吧,经常这样用,或许是你其他地方出现的问题。好好检查一下。   回复  引用  查看    

#11楼  2008-03-11 13:17 KS [未注册用户]

Inherits="Test.Rss", 里面的Test.rss从何而来.
还有我输出到页面的内容,变成字符串了.   回复  引用    

#12楼 [楼主] 2008-03-13 14:17 waitu      

@KS
汗了!名称空间都没看出来麽?   回复  引用  查看    

#13楼  2008-05-28 12:31 尧虫 [未注册用户]

为什么按照你的方式,不行啊...GetItemsRss();IList<Model.Info> listInfo等都错了...   回复  引用    

#14楼 [楼主] 2008-05-28 16:16 waitu      

把名称空间给加上。:)   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-05-11 09:45 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接:
 

导航

公告

function $chk(obj){ return !!(obj || obj === 0); };

统计

与我联系

搜索

 

留言簿(23)

随笔分类(279)

随笔档案(296)

友情链接

资源

积分与排名

最新评论

阅读排行榜

评论排行榜