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