前段时间在写RSS Feed。
  经过了几次的修改,把相关的代码写成了单独的类。感觉重用时还算比较方便的。于是贴出来,大家一起研究研究。以下是RssBase.cs类:
 1using System;
 2using System.Collections.Generic;
 3using System.Xml;
 4
 5namespace MyMedia.Utilities
 6{
 7 public class RssBase
 8 {
 9 RssBase constructor#region RssBase constructor
 10 public RssBase(XmlTextWriter rssWriter)
 11 {
 12 this.rssWriter = rssWriter;
 13 }
 14 public RssBase(XmlTextWriter rssWriter, bool hasMedia, IList items)
 15 {
 16 this.rssWriter = rssWriter;
 17 this.hasMedia = hasMedia;
 18 this.items = items;
 19 }
 20 #endregion
 21
 22 [Serializable]
 23 public sealed class ItemInfo
 24 {
 25 ItemInfo constructor#region ItemInfo constructor
 26 public ItemInfo() { }
 27 public ItemInfo(string itemTitle, string itemLink, string itemDescription, string itemPubDate, string itemAuthor, string itemGuid)
 28 {
 29 this.itemTitle = itemTitle;
 30 this.itemLink = itemLink;
 31 this.itemDescription = itemDescription;
 32 this.itemAuthor = itemAuthor;
 33 this.itemGuid = itemGuid;
 34 this.itemPubDate = itemPubDate;
 35 }
 36 public ItemInfo(string itemTitle, string itemLink, string itemDescription, string itemPubDate, string itemAuthor,
 37 string itemGuid, string mediaContentUrl, string mediaTitle, string mediaDescription,
 38 string mediaThumbUrl, string mediaThumbWidth, string mediaThumbHeight, string mediaAuthor)
 39 {
 40 this.itemTitle = itemTitle;
 41 this.itemLink = itemLink;
 42 this.itemDescription = itemDescription;
 43 this.itemPubDate = itemPubDate;
 44 this.itemAuthor = itemAuthor;
 45 this.itemGuid = itemGuid;
 46 this.mediaContentUrl = mediaContentUrl;
 47 this.mediaTitle = mediaTitle;
 48 this.mediaDescription = mediaDescription;
 49 this.mediaThumbUrl = mediaThumbUrl;
 50 this.mediaThumbWidth = mediaThumbWidth;
 51 this.mediaThumbHeight = mediaThumbHeight;
 52 this.mediaAuthor = mediaAuthor;
 53 }
 54 #endregion
 55
 56 Internal item variables#region Internal item variables
 57 // Item variables
 58 private string itemTitle;
 59 private string itemLink;
 60 private string itemDescription;
 61 private string itemPubDate = DateTime.Now.ToString("r");
 62 private string itemDateTaken = DateTime.Now.ToString();
 63 private string itemAuthor;
 64 private string itemGuid;
 65 // Media variables
 66 private string mediaContentUrl;
 67 private string mediaTitle;
 68 private string mediaDescription;
 69 private string mediaThumbUrl;
 70 private string mediaThumbWidth;
 71 private string mediaThumbHeight;
 72 private string mediaAuthor;
 73 #endregion
 74
 75 Item properties#region Item properties
 76 public string ItemTitle
 77 {
 78 set { itemTitle = value; }
 79 get { return itemTitle; }
 80 }
 81 public string ItemLink
 82 {
 83 set { itemLink = value; }
 84 get { return itemLink; }
 85 }
 86 public string ItemDescription
 87 {
 88 set { itemDescription = value; }
 89 get { return itemDescription; }
 90 }
 91 public string ItemPubDate
 92 {
 93 set { itemPubDate = value; }
 94 get { return itemPubDate; }
 95 }
 96 public string ItemDateTaken
 97 {
 98 set { itemDateTaken = value; }
 99 get { return itemDateTaken; }
100 }
101 public string ItemAuthor
102 {
103 set { itemAuthor = value; }
104 get { return itemAuthor; }
105 }
106 public string ItemGuid
107 {
108 set { itemGuid = value; }
109 get { return itemGuid; }
110 }
111 public string MediaContentUrl
112 {
113 set { mediaContentUrl = value; }
114 get { return mediaContentUrl; }
115 }
116 public string MediaTitle
117 {
118 set { mediaTitle = value; }
119 get { return mediaTitle; }
120 }
121 public string MediaDescription
122 {
123 set { mediaDescription = value; }
124 get { return mediaDescription; }
125 }
126 public string MediaThumbUrl
127 {
128 set { mediaThumbUrl = value; }
129 get { return mediaThumbUrl; }
130 }
131 public string MediaThumbWidth
132 {
133 set { mediaThumbWidth = value; }
134 get { return mediaThumbWidth; }
135 }
136 public string MediaThumbHeight
137 {
138 set { mediaThumbHeight = value; }
139 get { return mediaThumbHeight; }
140 }
141 public string MediaAuthor
142 {
143 set { mediaAuthor = value; }
144 get { return mediaAuthor; }
145 }
146 #endregion
147
148 }
149
150 Const string#region Const string
151 private const string TITLE = "MyMedia RSS";
152 private const string XMLNS_MEDIA = "http://www.MyWii.com.au";
153 private const string XMLNS_DC = "http://purl.org/dc/elements/1.1/";
154 private const string LINK = "http://www.MyWii.com.au/";
155 private const string DESCRIPTION = "description";
156 private const string LANGUAGE = "en-us";
157 private const string COPYRIGHT = "Copyright 2006";
158 private const string GENERATOR = "MyMedia RSS Generator";
159 private const string IMAGE_URL = "http://www.MyWii.com.au/img/main/feed.gif";
160 private const string IMAGE_TITLE = "MyWii";
161 private const string IMAGE_LINK = "http://www.MyWii.com.au";
162 private string PUB_DATE = DateTime.Now.ToString("r");
163 private string LAST_BUILD_DATE = DateTime.Now.ToString("r");
164
165 #endregion
166
167 Internal member variables#region Internal member variables
168 private XmlTextWriter rssWriter;
169 private bool hasMedia;
170 private IList items;
171 #endregion
172
173 Properties#region Properties
174 public XmlTextWriter RssWriter
175 {
176 set { rssWriter = value; }
177 get { return rssWriter; }
178 }
179 public bool HasMedia
180 {
181 set { hasMedia = value; }
182 get { return hasMedia; }
183 }
184 public IList Items
185 {
186 set { items = value; }
187 get { return items; }
188 }
189
190 #endregion
191
192 Private method#region Private method
193
194 private void WritePrologue()
195 {
196 rssWriter.WriteStartDocument();
197 rssWriter.WriteStartElement("rss");
198 rssWriter.WriteAttributeString("version", "2.0");
199 rssWriter.WriteAttributeString("xmlns:media", XMLNS_MEDIA);
200 rssWriter.WriteAttributeString("xmlns:dc", XMLNS_DC);
201 rssWriter.WriteString("\n ");
202 // Write in channel block
203 rssWriter.WriteStartElement("channel");
204 rssWriter.WriteString("\n ");
205 rssWriter.WriteElementString("title", TITLE);
206 rssWriter.WriteString("\n ");
207 rssWriter.WriteElementString("link", LINK);
208 rssWriter.WriteString("\n ");
209 rssWriter.WriteElementString("description", DESCRIPTION);
210 rssWriter.WriteString("\n ");
211 rssWriter.WriteElementString("pubDate", PUB_DATE);
212 rssWriter.WriteString("\n ");
213 rssWriter.WriteElementString("lastBuildDate", LAST_BUILD_DATE);
214 rssWriter.WriteString("\n ");
215 rssWriter.WriteElementString("language", LANGUAGE);
216 rssWriter.WriteString("\n ");
217 rssWriter.WriteElementString("copyright", COPYRIGHT);
218 rssWriter.WriteString("\n ");
219 rssWriter.WriteElementString("generator", GENERATOR);
220 rssWriter.WriteString("\n ");
221 // Write in image block
222 rssWriter.WriteStartElement("image");
223 rssWriter.WriteString("\n ");
224 rssWriter.WriteElementString("url", IMAGE_URL);
225 rssWriter.WriteString("\n ");
226 rssWriter.WriteElementString("title", IMAGE_TITLE);
227 rssWriter.WriteString("\n ");
228 rssWriter.WriteElementString("link", IMAGE_LINK);
229 rssWriter.WriteString("\n ");
230 rssWriter.WriteEndElement();
231 rssWriter.WriteString("\n ");
232 }
233
234 /**//// 
235 /// Write in items
236 /// 
237 private void WriteItem(ItemInfo item)
238 {
239 // Write in item block
240 rssWriter.WriteStartElement("item");
241 rssWriter.WriteString("\n ");
242 rssWriter.WriteElementString("title", item.ItemTitle);
243 rssWriter.WriteString("\n ");
244 rssWriter.WriteElementString("link", item.ItemLink);
245 rssWriter.WriteString("\n ");
246
247 rssWriter.WriteStartElement("description");
248 rssWriter.WriteString("\n ");
249 rssWriter.WriteCData(item.ItemDescription);
250 rssWriter.WriteString("\n ");
251 rssWriter.WriteEndElement();
252
253 rssWriter.WriteString("\n ");
254 rssWriter.WriteElementString("pubDate", item.ItemPubDate);
255 rssWriter.WriteString("\n ");
256 rssWriter.WriteElementString("dc:date.Taken", item.ItemDateTaken);
257 rssWriter.WriteString("\n ");
258 rssWriter.WriteElementString("author", item.ItemAuthor);
259 rssWriter.WriteString("\n ");
260 rssWriter.WriteStartElement("guid");
261 rssWriter.WriteAttributeString("isPermaLink", "false");
262 rssWriter.WriteString(item.ItemGuid);
263 rssWriter.WriteEndElement();
264
265
266 // Write item media here
267
268 }
269
270 /**//// 
271 /// Write in item media
272 /// 
273 /// ItemInfo item
274 private void WriteItemMedia(ItemInfo item)
275 {
276 // Write in media
277 rssWriter.WriteString("\n ");
278 rssWriter.WriteStartElement("media:content");
279 rssWriter.WriteAttributeString("url", item.MediaContentUrl);
280 rssWriter.WriteAttributeString("type", "image/jpeg");
281 rssWriter.WriteEndElement();
282 rssWriter.WriteString("\n ");
283 rssWriter.WriteElementString("media:title", item.MediaTitle);
284 rssWriter.WriteString("\n ");
285 rssWriter.WriteStartElement("media:text");
286 rssWriter.WriteAttributeString("type", "html");
287 rssWriter.WriteString(item.MediaDescription);
288 rssWriter.WriteEndElement();
289 rssWriter.WriteString("\n ");
290 rssWriter.WriteStartElement("media:thumbnail");
291 rssWriter.WriteAttributeString("url", item.MediaThumbUrl);
292 rssWriter.WriteAttributeString("height", item.MediaThumbHeight);
293 rssWriter.WriteAttributeString("width", item.MediaThumbWidth);
294 rssWriter.WriteEndElement();
295 rssWriter.WriteString("\n ");
296 rssWriter.WriteStartElement("media:credit");
297 rssWriter.WriteAttributeString("role", "photographer");
298 rssWriter.WriteString(item.MediaAuthor);
299 rssWriter.WriteEndElement();
300 rssWriter.WriteString("\n ");
301
302 }
303
304 /**//// 
305 /// Close item element 
306 /// 
307 private void WriteItemEnd()
308 {
309 rssWriter.WriteString("\n ");
310 rssWriter.WriteEndElement();
311 rssWriter.WriteString("\n ");
312 }
313
314 /**//// 
315 /// Close all the elements
316 /// 
317 private void WriteEnd()
318 {
319 rssWriter.WriteEndElement();
320 rssWriter.WriteString("\n");
321 rssWriter.WriteEndElement();
322 rssWriter.WriteEndDocument();
323 }
324
325 #endregion
326
327 /**//// 
328 /// Write RSS feed
329 /// 
330 public void WriteRSS()
331 {
332 WritePrologue();
333 foreach (ItemInfo info in items)
334 {
335 WriteItem(info);
336 if (hasMedia)
337 WriteItemMedia(info);
338 WriteItemEnd();
339 }
340 WriteEnd();
341 }
342 }
343}
  然后使用一个FeedBase.cs类,调用上面的RssBase类中的方法和属性。代码如下。(该文件有改动,如要编译,需做相关修改)
1 using System.Collections.Generic;
2 using System.Configuration;
3 using System.Data;
4 using System.Text;
5 using System.Web;
6 using System.Web.UI;
7 using System.Xml;
8
9
10public class FeedBase : Page
11{
12 public void GenerateRss()
13 {
14
15 IList items = new List();
16
17 // Populate items. 
18 foreach (DataRow row in rows)
19 {
20 RssBase.ItemInfo item = new RssBase.ItemInfo(row["Title"].ToString(), "link", row["Description"].ToString(), row["PubDate"].ToString(), row["Author"].ToString(), "guid");
21 items.Add(item);
22 }
23
24 XmlTextWriter xmlWriter = new XmlTextWriter(Response.OutputStream,
25 Encoding.UTF8);
26
27 RssBase rssBase = new RssBase(xmlWriter, false, items);
28 rssBase.WriteRSS();
29
30 xmlWriter.Flush();
31 xmlWriter.Close();
32
33 Response.ContentEncoding = Encoding.UTF8;
34 Response.ContentType = "text/xml";
35 Response.Cache.SetCacheability(HttpCacheability.Public);
36
37 Response.End();
38 }
39
40 }
  最后,只要新建一个feed.aspx文件,继承FeedBase类,调用该类中的GenerateRss()方法就可以轻松生成你所期望的RSS Feed :)