编辑: 向日葵8AS | 2014-11-22 |
using System.IO;
using System.Data;
using System.Xml;
using System.Collections.Generic;
using System.Text;
public class Rss { public Stream OutputStream;
public string RssTitle;
public string PublisherUrl;
public string Description;
public string Copyright;
public string Generator;
public DataSet ItemSource;
public string ItemTitleField;
public string ItemUrlField;
public string ItemDescriptionField;
public string ItemPublicationDateField;
public string ItemAuthor;
public static void PublishRss(Rss r){ XmlTextWriter writer = new XmlTextWriter(r.OutputStream, Encoding.UTF8);
writer.WriteStartDocument();
writer.WriteStartElement( rss );
writer.WriteAttributeString( version , 2.0 );
writer.WriteStartElement( channel );
writer.WriteElementString( title , r.RssTitle);
writer.WriteElementString( link , r.PublisherUrl);
writer.WriteElementString( description , r.Description);
writer.WriteElementString( copyright , r.Copyright);
writer.WriteElementString( generator , r.Generator);
foreach (DataRow row in r.ItemSource.Tables[0].Rows) { writer.WriteStartElement( item );
writer.WriteElementString( author , row[r.ItemAuthor].ToString());
writer.WriteElementString( title , row[r.ItemTitleField].ToString());
writer.WriteElementString( link , row[r.ItemUrlField].ToString());
writer.WriteElementString( description , row[r.ItemDescriptionField].ToString());
writer.WriteElementString( pubDate , Convert.ToDateTime(row[r.ItemPublicationDateField]).ToString( dd MMM yyyy hh:mm:00 ));
writer.WriteEndElement();
} writer.WriteEndElement();
writer.WriteEndElement();
writer.Flush();
} } NOTE: 这里 pubDate 的日期格式很重要, 当你按上面的代码对 pubDate 进行格式转换的时候, 假如数据库中是 2007-9-14 9:58,那么在英文操作系统下,会转换成
14 Sep
2007 9:58 , 这个是没有问题的.但在中文操作系统下,就变成了
14 九月
2007 9:58 .导致的结果就是 在IE7 中点开 rss 源的时候,发现日期没有显示.如果你不进行数据格式转换,简单的使用一个 ToString(),结果仍是如此.这里,我是写了一个方法,对它进行了格式转换: // ... 省略 ... writer.WriteElementString( pubDate , GetRssDate(row[r.ItemPublicationDateField]));
// ... 省略 ... public static string GetRssDate(Object date) { DateTime rssDate = Convert.ToDateTime(date);
string[] monthName = { Jan , Feb , Mar , Apr , May , Jun , Jul , Aug , Sep , Oct , Nov , Dec };
StringBuilder sb = new StringBuilder();
sb.Append(rssDate.Day);
sb.Append( );
sb.Append(monthName[Convert.ToInt32(rssDate.Month) - 1]);
sb.Append( );
sb.Append(rssDate.Year);
sb.Append( );
sb.Append(rssDate.ToLongTimeString());
return sb.ToString();
} 我看到 ToString()有一个重载了的方法,接受一个 IFormatProvider 类型的参数,这个应 该是进行格式转换的标准方式,MSDN 的范例有点长了,就没有研究下去.如果哪位朋友对这里 有好的解决方法,可以在回复在评论中,Thanks. 创建属性就像上面显示的那样容易. PublishRss()方法是我们这里关心的核心内容. 我们创 建了 System.Xml.XmlTextWriter 类的实例. 这个类是撰写 XML 文档的快速方式. 在这个例子中, 我们传递进一个 OutputStream 对象, 并确定编码(UTF-8). 然后我们开始写入这个文档的不同部 分.我们使用 XmlTextWriter 类的下面这些方法. z WriteStartDocument():这个方法写入 XML 1.0 版本的声明.也就是: .当不写这个声明的时候,在FireFox 中虽 然可以订阅,但是看不到任何条目,也不能进行更新.IE7 下正常. z WriteStartElement:这个方法写入指定标签的起始标记. z WriteAttributeString:这个方法为当前打开的标签写入属性. z WriteElementString: 这个方法写入一个起始标记和一个结束标记, 以及起始和结束标 记之间的文本. z WriteEndElement:这个方法写入当前打开标记的结束标记.不需要在这里指明结束标 记的名字,因为在每次嵌套的时候都会在内部(NOTE:属于底层机制)设定. z Flush:这个方法将所有缓存的 output 清出到目的位置. 注意,你必须恰当地调用 WriteStartElement()和WriteEndElement()方法以生成格式良好 的(well formed)XML 文档. 创建 Asp.Net Web 窗体 现在我们已经创建好了一个通用类,我们可以在我们的 Web 窗体中使用它.假设我们将以 Rss 源形式发布的数据存储在一个表格(Article)中,这个表格的结构如下: ? Title - Varchar(255) ? Description - Varchar(1000) ? Url - Varchar(255) ? Author - Varchar(50) ? Pubdate - DateTime 以DataSet 形式获取 Table 内容 我们将在 Asp.Net Web 应用程序中创建一个 Rss.aspx 文件,在CodeBehind 中创建一个 GetDataSet()方法.这个方法使用 DataAdapter 来填充一个 Dataset. public DataSet GetDataSet() { SqlConnection conn = new SqlConnection( 你的连接字符串 );