RSS订阅实现
RSS(Really Simple Syndication,真正简单的连锁)是一种Web内容连锁格式。RSS成为通过Web连锁新闻内容的标准格式。在.NET3.5下,MS集成了RSS对象。 这样一改变,就很大的方便了创建和读取RSS了。本文将介绍的是基于.NET技术的RSS订阅开发实例。 首先搞了个Rss.aspx页面,在Page_Load方法里面显示让它以标准的xml格式输出 Response.Cache.SetNoStore(); 然后根据需要订阅的页面传过来的参数进行一番判断。把所有符合条件的资源都放在DataTable里面。
MemoryStream ms = new MemoryStream(); xmlTW.WriteElementString("link", ColumnDs.Tables[0].Rows[0]["CoulumnUrl"].ToString()); xmlTW.WriteElementString("description", ""); RSS订阅开发实例中要注意的是: 1.XML格式是大小写敏感的,这就意味着,XML元素的起始和终止标签必须匹配,拼写和大小写都必须一致。
< rssversionrssversion="2.0"> ... < /rss> < rss>元素只有一个子元素< channel>,用来描述聚合的内容。在< channel>元素里面有三个必需的子元素,用来描述Web站点的信息。这三个元素是: title—定义聚合文件的名称,一般来说,还会包括Web站点的名称; link—Web站点的URL; description—Web站点的一段简短的描述。 除此之外,还有一些可选元素来描述站点信息。这些元素的更多信息请参见RSS2.0规范。 每一个新闻项目放在一个单独的< item>元素中。< channel>元素可以有任意数量的< item>元素。每个< item>元素可以有多种的子元素, 唯一的要求是最少必须包含< title>元素和< description>元素其中一个作为子元素。以下列出了一些相关的< item>子元素:
link—新闻项目的URL; description—新闻项目的大纲; author—新闻项目的作者; pubDate—新闻项目的发布日期 3.< item>子元素尤其要注意的是pubDate的格式,RSS要求日期必须按照RFC822日期和时间规范进行格式化,此格式要求:开头是一个可选的3字母星期缩写加一个逗号,
接着必须是日加上3字母缩写的月份和年份,最后是一个带时区名的时间。 我们可以用Stirng.foemat()来转化如期格式,就如我上面那个例子。 RSS订阅开发实例的最终结果:
|
环境如下:
A:数据库环境:
SQLServer2005(数据库实例:机器名+SQLServer2005)
B:开发环境
Vs2005.net
数据库
程序代码
Create table Tb_Test(ID int identity(1,1),Title varchar(20), Description varchar(100), AddDate datetime default(getdate()))
go
insert into tb_test(Title,Description)
select '中国新闻','新华社网公司'
union all
select '中央新闻','中央电视台'
union all
select '国际新闻','国际广播'
union all
select '环球新闻','环球广播'
union all
select '凤凰新闻','凤凰卫视'
go
Web.config
程序代码
<?xml version="1.0"?>
<!--
注意: 除了手动编辑此文件以外,您还可以使用
Web 管理工具来配置应用程序的设置。可以使用 Visual Studio 中的
“网站”->“Asp.Net 配置”选项。
设置和注释的完整列表在
machine.config.comments 中,该文件通常位于
WindowsMicrosoft.NetFrameworkv2.xConfig 中
-->
<configuration>
<appSettings>
<add key="Db_cfgConn" value="server=.SQLSERVER2005;database=Test_DB;uid=sa;pwd=ylwtsmt"/>
</appSettings>
<connectionStrings/>
<system.web>
<!--
设置 compilation debug="true" 将调试符号插入
已编译的页面中。但由于这会
影响性能,因此只在开发过程中将此值
设置为 true。
-->
<compilation debug="true"/>
<!--
通过 <authentication> 节可以配置 ASP.NET 使用的
安全身份验证模式,
以标识传入的用户。
-->
<authentication mode="Windows"/>
<!--
如果在执行请求的过程中出现未处理的错误,
则通过 <customErrors> 节可以配置相应的处理步骤。具体说来,
开发人员通过该节可以配置
要显示的 html 错误页
以代替错误堆栈跟踪。
<customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
<error statusCode="403" redirect="NoAccess.htm" />
<error statusCode="404" redirect="FileNotFound.htm" />
</customErrors>
-->
</system.web>
</configuration>
VS.net 代码:
GetRSS类代码:
程序代码
using System;
using System.Da
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
public class GetRss
{
/**//// <summary>
/// 根据文件路径写RSS文件
/// </summary>
/// <remarks>
/// 例如:
/// WriteRss("D:Vs2005GenerateRssRSS_Folder est_tb.xml","test_tb")
/// 注意:根据表的结构,需要调整生成的RSS源。本实例仅供测试用。
/// </remarks>
/// <param name="pathfilename">文件路径</param>
/// <param name="tablename">表名</param>
/// <returns>true or false</returns>
public static bool WriteRss(string pathfilename,string tablename)
{
try
{
FileInfo finfo = new FileInfo(pathfilename);
using (FileStream fs = finfo.OpenWrite())
{
StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.GetEncoding("UTF-8"));
sw.WriteLine(GetRss.GetRSSString(tablename));
sw.Flush();
sw.Close();
}
return true;
}
catch (System.Exception ex)
{
System.Web.HttpContext.Current.Response.Write(ex.Message);
return false;
throw;
}
}
/**//// <summary>
/// 组织符合最新标准的RSS字符串
/// 参数:表名。
/// </summary>
/// <remarks>
/// 例如:
/// GetRSS()
/// 注意:根据表的结构,需要调整生成的RSS源。本实例仅供测试用。
/// </remarks>
/// <param name="tablename">表名</param>
/// <returns>返回一个DataSet 数据源</returns>
public static string GetRSSString(string Tablename)
{
try
{
DataSet ds = GetRSSData(Tablename);
string strRSS = "";
strRSS = strRSS + " <?xml version="1.0"?> " + System.Environment.NewLine;
strRSS = strRSS + " <rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"" + System.Environment.NewLine;
strRSS = strRSS + " xmlns:xsd="http://www.w3.org/2001/XMLSchema" " + System.Environment.NewLine;
strRSS = strRSS + " xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">" + System.Environment.NewLine;
strRSS = strRSS + " <channel>" + System.Environment.NewLine;
strRSS = strRSS + " <title>订阅标题</title> " + System.Environment.NewLine;
strRSS = strRSS + " <link>http://www.**com.cn/</link>" + System.Environment.NewLine;
strRSS = strRSS + " <description>描述信息</description>" + System.Environment.NewLine;
strRSS = strRSS + " <language>zh-CN</language>" + System.Environment.NewLine;
strRSS = strRSS + " <generator>www.**com.cn</generator> " + System.Environment.NewLine;
strRSS = strRSS + " <copyright>北京**公司</copyright> " + System.Environment.NewLine;
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
strRSS = strRSS + " <item>" + System.Environment.NewLine;
strRSS = strRSS + " <title>" + ds.Tables[0].Rows[i]["Title"] + "</title> " + System.Environment.NewLine;
strRSS = strRSS + " <link>http://www.**.com.cn/ArticleShow@" + ds.Tables[0].Rows[i]["ID"] + ".html</link> " + System.Environment.NewLine;
strRSS = strRSS + " <author /> " + System.Environment.NewLine;
strRSS = strRSS + " <guid>http://www.**.com.cn/ArticleShow@" + ds.Tables[0].Rows[i]["ID"] + ".html</guid> " + System.Environment.NewLine;
strRSS = strRSS + " <pubDate>" + Convert.ToDateTime(ds.Tables[0].Rows[i]["AddDate"].ToString()).ToString("yyyy-MM-dd HH:mm") + "</pubDate> " + System.Environment.NewLine;
strRSS = strRSS + " <comments>http://www.**.com.cn/ArticleShow@" + ds.Tables[0].Rows[i]["ID"] + ".html</comments> " + System.Environment.NewLine;
strRSS = strRSS + " <slash:comments>0</slash:comments> " + System.Environment.NewLine;
strRSS = strRSS + " <source url="http://www.**.com.cn/ArticleShow@" + ds.Tables[0].Rows[i]["ID"] + ".html">" + ds.Tables[0].Rows[i]["Title"] + " </source> " + System.Environment.NewLine;
strRSS = strRSS + " <description>" + ds.Tables[0].Rows[i]["Description"] + "</description>" + System.Environment.NewLine;
strRSS = strRSS + " </item>" + System.Environment.NewLine;
}
strRSS = strRSS + " </channel>" + System.Environment.NewLine;
strRSS = strRSS + " </rss>" + System.Environment.NewLine;
return strRSS;
}
catch (Exception ex)
{
System.Web.HttpContext.Current.Response.Write(ex.Message);
throw;
}
}
/**//// <summary>
/// 获取RSS数据源
/// 参数:表名。
/// </summary>
/// <remarks>
/// 例如:
/// DataSet ds = GetRSSData(TableName)
/// 注意:根据表的结构,需要调整生成的RSS源。本实例仅供测试用。
/// </remarks>
/// <param name="Tablename">表名</param>
/// <returns>返回一个DataSet 数据源</returns>
public static DataSet GetRSSData(string Tablename)
{
String DBConnStr = System.Configuration.ConfigurationManager.AppSettings["Db_cfgConn"];
System.Da
System.Da
if (Connection.State != ConnectionState.Open)
{
Connection.Open();
}
try
{
System.Da
Command.CommandType = CommandType.Text;
Command.Parameters.Add("@TABLENAME", SqlDbType.VarChar, 20);
Command.Parameters["@TABLENAME"].Value = Tablename;
Command.Parameters.Add("@COLUMNS", SqlDbType.VarChar, 2000);
Command.Parameters["@COLUMNS"].Value = "";
Command.ExecuteNonQuery();
DataAdapter.SelectCommand = Command;
DataSet DataSet = new DataSet();
if (DataSet != null)
{
DataAdapter.Fill(DataSet, "table");
}
return DataSet;
}
catch (System.Exception ex)
{
System.Web.HttpContext.Current.Response.Write(ex.Message);
Connection.Close();
throw;
}
}
}
前台代码(注意:html页面无其它html代码)
程序代码
using System;
using System.Da
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.IO;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string Tablename = "Tb_Test"; //Request.QueryString["TableName"];
string fname = System.Web.HttpContext.Current.Server.MapPath("RSS_Folder") + "\" + Tablename + ".XML";
GetRss.WriteRss(fname, Tablename);
}
}
该代码可以在当前程序下的(RSS_Folder)目录下生成以表命名的Xml文件。
以后可以在其它RSS阅读器中订阅RSS服务了。(包括Foxmail 6.0支持对RSS订阅)