zoukankan      html  css  js  c++  java
  • 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订阅)

  • 相关阅读:
    数据库基本设计
    servlet 高级知识之Listener
    servlet 高级知识之Filter
    servlet-生命周期
    http协议概述
    javase高级技术
    javase高级技术
    IO之4种字节流拷贝文件方式对比
    Map 概述
    图解 数组,链表,2种数据结构
  • 原文地址:https://www.cnblogs.com/lhws/p/2465048.html
Copyright © 2011-2022 走看看