RSS订阅实现

RSS(Really Simple Syndication,真正简单的连锁)是一种Web内容连锁格式。RSS成为通过Web连锁新闻内容的标准格式。在.NET3.5下,MS集成了RSS对象。

这样一改变,就很大的方便了创建和读取RSS了。本文将介绍的是基于.NET技术的RSS订阅开发实例。

首先搞了个Rss.aspx页面,在Page_Load方法里面显示让它以标准的xml格式输出

Response.Cache.SetNoStore(); 
    Response.ContentType = "application/xml"; 

然后根据需要订阅的页面传过来的参数进行一番判断。把所有符合条件的资源都放在DataTable里面。


接着用MemoryStream对象对xml进行操作,就不多说了,看了代码就会明白,同时也给自己做个备忘。RSS订阅开发实例如下:

MemoryStream ms = new MemoryStream(); 
XmlTextWriter xmlTW = new XmlTextWriter(ms, Encoding.UTF8); 
xmlTW.Formatting = Formatting.Indented; 
xmlTW.WriteStartDocument(); 
xmlTW.WriteStartElement("rss"); 
xmlTW.WriteAttributeString("version", "2.0"); 
xmlTW.WriteStartElement("channel"); 
if (WebID == 0)  {  } 
else  {  xmlTW.WriteElementString("title", "欢迎订阅"+WebDs.Tables[0].Rows[0]["Web_Name"].ToString()+">>"+ColumnDs.Tables[0].Rows[0]["ColumnName"].ToString()); 

 xmlTW.WriteElementString("link", ColumnDs.Tables[0].Rows[0]["CoulumnUrl"].ToString());  xmlTW.WriteElementString("description", ""); 

DataTable dt = ds.Tables[0]; 
foreach (DataRow dr in dt.Rows) 
{  xmlTW.WriteStartElement("item");  xmlTW.WriteElementString("title", dr["Article_Title"].ToString()); 
xmlTW.WriteElementString("link", GetNewsLink(dr)); 
xmlTW.WriteElementString("pubDate",string.Format("{0:R}",dr["CreateTime"]));
xmlTW.WriteElementString("author", dr["UserLogin_FullName"].ToString()); 
xmlTW.WriteElementString("description", Pub_Config.nohtml(Pub_Config.Substrin(dr["Article_Body"], 400)));  xmlTW.WriteEndElement(); 
}  xmlTW.WriteEndElement();  xmlTW.WriteEndElement();  xmlTW.WriteEndDocument();  xmlTW.Flush();  byte[] buffer = ms.ToArray(); 
Response.Write(Encoding.UTF8.GetString(buffer));  Response.End();  xmlTW.Close();  ms.Close();  ms.Dispose();

RSS订阅开发实例中要注意的是:

1.XML格式是大小写敏感的,这就意味着,XML元素的起始和终止标签必须匹配,拼写和大小写都必须一致。


2.RSS2.0的根元素是< rss>元素,这个元素可以有一个版本号的属性,例如:

< rssversionrssversion="2.0">   ...   < /rss> 

< rss>元素只有一个子元素< channel>,用来描述聚合的内容。在< channel>元素里面有三个必需的子元素,用来描述Web站点的信息。这三个元素是:

title—定义聚合文件的名称,一般来说,还会包括Web站点的名称;

link—Web站点的URL;

description—Web站点的一段简短的描述。

除此之外,还有一些可选元素来描述站点信息。这些元素的更多信息请参见RSS2.0规范。

每一个新闻项目放在一个单独的< item>元素中。< channel>元素可以有任意数量的< item>元素。每个< item>元素可以有多种的子元素,

唯一的要求是最少必须包含< title>元素和< description>元素其中一个作为子元素。以下列出了一些相关的< item>子元素:


title—新闻项目的标题;

link—新闻项目的URL;

description—新闻项目的大纲;

author—新闻项目的作者;

pubDate—新闻项目的发布日期

3.< item>子元素尤其要注意的是pubDate的格式,RSS要求日期必须按照RFC822日期和时间规范进行格式化,此格式要求:开头是一个可选的3字母星期缩写加一个逗号,

 


.

接着必须是日加上3字母缩写的月份和年份,最后是一个带时区名的时间。

我们可以用Stirng.foemat()来转化如期格式,就如我上面那个例子。

RSS订阅开发实例的最终结果:

 

 

 

  现在越来越多的网站都在做RSS聚合,就是为了方便浏览者利用RSS阅读器订阅,那么我们如何用.net来生成RSS文件呢?

    环境如下:

A:数据库环境:

    SQLServer2005(数据库实例:机器名+SQLServer2005)

B:开发环境

     Vs2005.net

数据库

用.NET生成方便Rss阅读器订阅的RSS文件 - 李 - 程序代码

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

用.NET生成方便Rss阅读器订阅的RSS文件 - 李 - 程序代码

<?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类代码:

用.NET生成方便Rss阅读器订阅的RSS文件 - 李 - 程序代码

using System;

using System.Data;

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.Data.SqlClient.SqlDataAdapter DataAdapter = new System.Data.SqlClient.SqlDataAdapter();

        System.Data.SqlClient.SqlConnection Connection = new System.Data.SqlClient.SqlConnection(DBConnStr);

        if (Connection.State != ConnectionState.Open)

        {

            Connection.Open();

        }

        try

        {

            System.Data.SqlClient.SqlCommand Command = new System.Data.SqlClient.SqlCommand("Select @COLUMNS=@COLUMNS+','+NAME FROM SYS.COLUMNS Where OBJECT_ID=OBJECT_ID(@TABLENAME)  orDER BY  column_id  SET @COLUMNS='Select '+STUFF(@COLUMNS,1,1,'')+' FROM '+@TABLENAME+''  EXEC(@COLUMNS) ", Connection);

            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代码)

用.NET生成方便Rss阅读器订阅的RSS文件 - 李 - 程序代码

using System;

using System.Data;

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订阅)

原文地址:https://www.cnblogs.com/lhws/p/2465048.html