引子http://www.cnblogs.com/heekui/archive/2007/01/27/631673.html
目前的网站项目里面有一块资讯的栏目,这一次项目组决定用RSS的方式发布,与国际接轨哈。呵呵~
那么我们的新闻资讯需要生成一些频道的RSS文件,还是祭起我们的老伙计:ASP.NET,让它去动态生成这个中规中矩的XML文件吧!
首先我们可得完成RSS的生成类,Channel(频道) 和 Item(条目),在这里只是按RSS的规则添加了一些必要的节点项目。
类图
![]()
ITEM类:很简单,定义了一个条目信息常用的一些元素
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
![]()
public class Item
![]()
![]()
{
![]()
字段#region 字段
![]()
/**//// <summary>
/// 标题
/// </summary>
private string title;
![]()
/**//// <summary>
/// 链接
/// </summary>
private string link;
![]()
/**//// <summary>
/// 描述
/// </summary>
private string description;
![]()
/**//// <summary>
/// 发布日期
/// </summary>
private string pubdate;
![]()
/**//// <summary>
/// 来源
/// </summary>
private string source;
![]()
/**//// <summary>
/// 作者
/// </summary>
private string author;
#endregion
![]()
![]()
属性#region 属性
![]()
/**//// <summary>
/// 标题
/// </summary>
public string Title
![]()
{
get
![]()
{
return this.title;
}
set
![]()
{
this.title = value;
}
}
![]()
![]()
/**//// <summary>
/// 链接
/// </summary>
public string Link
![]()
{
get
![]()
{
return this.link;
}
set
![]()
{
this.link = value;
}
}
![]()
![]()
/**//// <summary>
/// 描述
/// </summary>
public string Description
![]()
{
get
![]()
{
return this.description;
}
set
![]()
{
this.description = value;
}
}
![]()
![]()
/**//// <summary>
/// 发布日期
/// </summary>
public string Pubdate
![]()
{
get
![]()
{
return this.pubdate;
}
set
![]()
{
this.pubdate = value;
}
}
![]()
![]()
/**//// <summary>
/// 来源
/// </summary>
public string Source
![]()
{
get
![]()
{
return this.source;
}
set
![]()
{
this.source = value;
}
}
![]()
![]()
/**//// <summary>
/// 来源
/// </summary>
public string Author
![]()
{
get
![]()
{
return this.author;
}
set
![]()
{
this.author = value;
}
}
#endregion
![]()
![]()
构造函数#region 构造函数
![]()
/**//// <summary>
/// 资讯条目
/// </summary>
public Item()
![]()
{
![]()
}
![]()
![]()
/**//// <summary>
/// 资讯条目
/// </summary>
/// <param name="Title">标题</param>
/// <param name="Link">链接</param>
/// <param name="Description">描述</param>
public Item(string Title, string Link, string Description)
![]()
{
this.title = Title;
this.link = Link;
this.description = Description;
}
#endregion
}
![]()
CHANNEL类:常用的频道信息,以及一个条目组,对条目组的添加方法,以及把CHANNEL导出XML的一些方法。组成XML文件时,没有传统意义上的XmlDocument的操作方式,感觉麻烦,不若直接按格式凑文本来的快。^_*
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Data;
using System.IO;
using System.Text;
using System.Xml;
![]()
public class Channel
![]()
![]()
{
![]()
字段#region 字段
![]()
/**//// <summary>
/// 标题
/// </summary>
private string title;
![]()
/**//// <summary>
/// 链接
/// </summary>
private string link;
![]()
/**//// <summary>
/// 描述
/// </summary>
private string description;
![]()
/**//// <summary>
/// 条目组
/// </summary>
private Item[] items;
#endregion
![]()
![]()
属性#region 属性
![]()
/**//// <summary>
/// 描述
/// </summary>
public string Description
![]()
{
get
![]()
{
return this.description;
}
set
![]()
{
this.description = value;
}
}
![]()
![]()
/**//// <summary>
/// 条目组
/// </summary>
public Item[] Items
![]()
{
get
![]()
{
return this.items;
}
}
![]()
![]()
/**//// <summary>
/// 标题
/// </summary>
public string Title
![]()
{
get
![]()
{
return this.title;
}
set
![]()
{
this.title = value;
}
}
![]()
![]()
/**//// <summary>
/// 链接
/// </summary>
public string Link
![]()
{
get
![]()
{
return this.link;
}
set
![]()
{
this.link = value;
}
}
#endregion
![]()
![]()
构造函数#region 构造函数
![]()
/**//// <summary>
/// 资讯频道
/// </summary>
public Channel()
![]()
{
![]()
}
#endregion
![]()
![]()
方法#region 方法
![]()
/**//// <summary>
/// 添加条目到频道
/// </summary>
public void AddItem( Item item )
![]()
{
if (this.items == null)
![]()
{
this.items = new Item[1];
this.items[0] = item;
}
else
![]()
{
Item[] itemTemp = new Item[this.items.Length];
itemTemp = this.items;
this.items = new Item[this.items.Length + 1];
for ( int i = 0; i < itemTemp.Length; i ++ )
![]()
{
this.items[i] = itemTemp[i];
}
this.items[this.items.Length-1] = item;
}
}
![]()
![]()
/**//// <summary>
/// 获取频道的RSS文件的内容
/// </summary>
public string GetRSS()
![]()
{
StringBuilder strRtn = new StringBuilder();
string strLine = string.Empty;
![]()
strLine = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
strRtn.Append(strLine);
![]()
strRtn.Append("<rss version=\"2.0\">");
strRtn.Append("<channel>");
![]()
strRtn.Append("<title>" + this.title + "</title>");
strRtn.Append("<link>" + this.link + "</link>");
![]()
if (!string.IsNullOrEmpty(this.description))
![]()
{
strLine = "<description>" + this.description + "</description>";
strRtn.Append(strLine);
}
![]()
foreach (Item newsItem in this.items)
![]()
{
strRtn.Append("<item>");
![]()
strRtn.Append("<title><![CDATA[" + newsItem.Title + " ]]></title>");
strRtn.Append("<link><![CDATA[" + newsItem.Link + " ]]></link>");
![]()
if (!string.IsNullOrEmpty(newsItem.Description))
![]()
{
strLine = "<description><![CDATA[" + newsItem.Description + " ]]></description>";
strRtn.Append(strLine);
}
![]()
if (!string.IsNullOrEmpty(newsItem.Pubdate))
![]()
{
strLine = "<pubDate><![CDATA[" + newsItem.Pubdate + " ]]></pubDate>";
strRtn.Append(strLine);
}
![]()
if (!string.IsNullOrEmpty(newsItem.Source))
![]()
{
strLine = "<source><![CDATA[" + newsItem.Source + " ]]></source>";
strRtn.Append(strLine);
}
![]()
if (!string.IsNullOrEmpty(newsItem.Author))
![]()
{
strLine = "<author><![CDATA[" + newsItem.Author + " ]]></author>";
strRtn.Append(strLine);
}
![]()
strRtn.Append("</item>");
}
![]()
strRtn.Append("</channel>");
strRtn.Append("</rss>");
![]()
return strRtn.ToString();
}
![]()
![]()
/**//// <summary>
/// 获取频道的RSS文件
/// </summary>
public void GetRSSFile(string fileName)
![]()
{
StreamWriter sw = new StreamWriter(fileName,false);
sw.WriteLine(this.GetRSS());
sw.Close();
}
![]()
![]()
/**//// <summary>
/// 获取频道的RSS XMLDocument
/// </summary>
public XmlDocument GetRSSDocument()
![]()
{
XmlDocument xmlRtn = new XmlDocument();
xmlRtn.LoadXml(this.GetRSS());
![]()
return xmlRtn;
}
#endregion
}
![]()
类做好了,接下来完成RSS页的代码构建。前台不用管它,需要做的是它的cs程序:
RSS.aspx .cs: 从数据库获取频道和条目信息,组成RSS文件。
访问时,可加上连接字符串,改变频道,例如:
http://localhost/xmlDataSet/Rss.aspx?channel=00001
http://localhost/xmlDataSet/Rss.aspx?channel=00002
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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.Xml;
using System.Data.OleDb;
![]()
public partial class Rss : System.Web.UI.Page
![]()
![]()
{
protected void Page_Load(object sender, EventArgs e)
![]()
{
//made by hekui 2007-01-27
![]()
![]()
根据查询字符串,判断查看的频道#region 根据查询字符串,判断查看的频道
string strChannel_ID;
![]()
if (string.IsNullOrEmpty(Request["channel"]))
![]()
{
strChannel_ID = "00001";
}
else
![]()
{
strChannel_ID = Request["channel"];
}
#endregion
![]()
![]()
构造频道信息#region 构造频道信息
DataTable dtChannel = getTable("select TITLE,LINK,DESCRIPTION from CHANNEL where CHANNEL_ID = '" + strChannel_ID + "'");
Channel channel = new Channel();
channel.Title = dtChannel.Rows[0]["TITLE"].ToString();
channel.Link = dtChannel.Rows[0]["LINK"].ToString();
channel.Description = dtChannel.Rows[0]["DESCRIPTION"].ToString();
#endregion
![]()
![]()
构造条目信息#region 构造条目信息
DataTable dtItem = getTable("select TITLE,LINK,DESCRIPTION,PUBDATE,SOURCE,AUTHOR from ITEM where CHANNEL_ID = '" + strChannel_ID + "'");
foreach (DataRow dr in dtItem.Rows)
![]()
{
Item item = new Item();
item.Title = dr["TITLE"].ToString();
item.Link = dr["LINK"].ToString();
item.Description = dr["DESCRIPTION"].ToString();
item.Pubdate = dr["PUBDATE"].ToString();
item.Source = dr["SOURCE"].ToString();
item.Author = dr["AUTHOR"].ToString();
![]()
channel.AddItem(item);
}
#endregion
![]()
![]()
RSS内容导出#region RSS内容导出
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "text/xml;charset='utf-8'";
Response.Write(channel.GetRSS());
Response.End();
#endregion
}
![]()
![]()
获取数据库链接#region 获取数据库链接
private OleDbConnection getConn()
![]()
{
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("news.mdb") + ";Persist Security Info=False";
OleDbConnection conn = new OleDbConnection(strConn);
return conn;
}
#endregion
![]()
![]()
根据SQL获取DataTable#region 根据SQL获取DataTable
private DataTable getTable(string sqlString)
![]()
{
OleDbDataAdapter da = new OleDbDataAdapter(sqlString, getConn());
DataSet ds = new DataSet();
da.Fill(ds);
return ds.Tables[0];
}
#endregion
}
![]()
示例程序:/Files/heekui/xmlDataSet.rar
示例程序里还有一个页面:一个简易的RSS阅读器,代码处理没按套路出牌,直接DataSet装载RSS源的。数据库玩惯了,Table的操作习惯些。