首先了解一下RSS是什么,有什么用,然后了解如何用,有什么可以方法可以节省我们的开发和学习成本:
RSS是什么,按照我个人的理解RSS是一个xml格式的字符串,这个字符串通过一个url地址来获取(这个地址可能是一个格式的文本文件、或者是一个动态网页或者能动态生成需要的文本的东东- -!),必须注意的是,xml的格式是被固定下来的,有自己的一套节点和节点属性定义(根据不同的版本会有不同的规范),哪些节点是必须有的,那些可有可无都是被规定下来的。
RSS有什么用,简单来说就是通过RSS阅读器(IE、FF等浏览器本身就是,强力些的可以用outlook)收藏你喜欢的RSS(成为RssFeed),阅读RSS,RSS更新的时候会主动通知你。我发现我试图说明白但是似乎说不明白,下面是在W3CSchool抄下来的:
- 通过使用 RSS,您可以有选择地浏览您感兴趣的以及与您的工作相关的新闻。
- 通过使用 RSS,您可以把需要的信息从不需要的信息(兜售信息,垃圾邮件等)中分离出来。
- 通过使用 RSS,您可以创建自己的新闻频道,并将之发布到因特网。
节省开发和学习成本,学习技术上的东西,最简介的方法是看文档,当然最好是中文的并且翻译得专业点的;减少开发成本的话一般是找现成的东西,不过还是那句话,用别人的东西最好不要拿来就立刻用,特别是开源的东西,最好看一下别人怎么写,整体看一下也好,这对灵活地使用已经日后可能的扩展都是很有帮助的,并且有可能在看的过程中能吸收到一些好的编码技巧。这里我找了 RSS.NET这个组件。
RSS.NET组件:
这个组件主要做的事情其实不多,就是读取和生成RSS,不过是以面向对象的思想把RSS中的各个元素(xml节点)做成对象,在使用的时候我们只需要知道RSS的地址和版本,然后调用这个组件的相关方法读取这个RSS,得到的不是一个需要我们去解析的xml字符串,而是这个组件为我们提供的对象(一个RssFeed类对象),以对象-属性的形式我们可以读取一个RSSChannel,在Channel中读取到RssItem集合,接着很方便地在代码里面读取RSS的各个元素,按照自己的需要对内容进行数据呈现,这一过程和我们在用.NET给我们提供的类(例如和数据库访问有关的类)一样方便。生成RSS是一个逆向的过程,我们要做的是创建需要的对象(这些对象由该组件提供),一般做法是实例化一个RssFeed类对象,给他添加RSSChannel,给RSSChannel添加RssItem,最后调用RssFeed的方法生成一个xml文件或者获取xml字符串然后自己处理(这是个符合RSS格式的xml字符串)。
下面节选一段我博客里面的代码,完成生成RSS的工作(生成一个xml文件),只是一个代码片段(关于这个组件的时候文章最后给出官方网站的地址和下载地址)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
/// <summary>
/// 创建Rss文件
/// </summary>
/// <param name="fileName">文件全路径(物理路径)</param>
/// <param name="isAutoUpdate">是否是系统自动更新</param>
public
En_OperResult UpdateRss(
string
fileName,
bool
isAutoUpdate)
{
En_OperResult re = En_OperResult.UpdateRss_Fail;
try
{
// 获取所有文章
IList<Model.MO_Article> allArticles = GetAllArticle();
if
(allArticles.Count <= 0)
{
// 没有文章,直接返回结果(没有内容)
return
En_OperResult.UpdateRss_NoItem;
}
// 获取所有用户
IList<Model.MO_MyUser> allUsers = _userBll.GetAllUser();
// 获取所有文章分类
IList<Model.MO_Category> allArticleCates = _categoryBll.GetAllCategories(Model.MO_Category.En_CategoryType.Artical);
// 创建RssFeed
Rss.RssFeed feed =
new
Rss.RssFeed(System.Text.Encoding.UTF8);
// 创建RssChannel
Rss.RssChannel channel = CreateRssChannel();
for
(
int
i = allArticles.Count - 1; i >= 0; i--)
{
Model.MO_Article article = allArticles[i];
channel.Items.Add(CreateRssItem(article, allUsers, allArticleCates));
}
// 把RssChannel添加到Feed,生成Rss文件
feed.Channels.Add(channel);
feed.Write(fileName);
re = En_OperResult.UpdateRss_Success;
if
(!isAutoUpdate)
{
// 写日志
WriteOperLog(
"更新Rss"
);
}
}
catch
(Exception ex)
{
WriteErrorLog(ex.Message);
re = En_OperResult.UpdateRss_Fail;
}
return
re;
}
/// <summary>
/// 创建Rss条目
/// </summary>
/// <param name="article">文章</param>
/// <param name="allUser">所有用户</param>
/// <param name="articleCategories">所有文章分类</param>
/// <returns></returns>
private
Rss.RssItem CreateRssItem(Model.MO_Article article, IList<Model.MO_MyUser> allUser, IList<Model.MO_Category> articleCategories)
{
string
link =
string
.Format(
"{0}/{1}?id={2}"
, Common.CommonTools.GetRootUrl()
,
"Article.aspx"
, article.ID);
Uri linkUrl =
new
Uri(link);
string
comments =
string
.Format(
"{0}&temp=#lwfield"
, link);
Model.MO_MyUser user = allUser.First(u => u.ID == article.UserID);
Model.MO_Category articleCate = articleCategories.First(c => c.ID == article.ArticleCategoryID);
Rss.RssItem item =
new
Rss.RssItem()
{
Title = article.ArticleTitle,
Link = linkUrl,
Description = article.ArticleSummary,
Comments = comments,
PubDate = article.CreateTime,
Author = user !=
null
? user.UserAccount :
"Tiu"
,
Guid =
new
Rss.RssGuid() { Name = link }
};
item.Categories.Add(
new
Rss.RssCategory()
{
Name = articleCate !=
null
? articleCate.CategoryName :
string
.Empty
});
return
item;
}
/// <summary>
/// 创建Rss频道(所有文章)
/// </summary>
/// <returns></returns>
private
Rss.RssChannel CreateRssChannel()
{
string
title = Common.AppSetting.SiteName;
string
desc = title;
Uri link =
new
Uri(Common.CommonTools.GetRootUrl());
string
email = Common.AppSetting.MasterEmail;
DateTime now = DateTime.Now;
string
copyRight =
"Serafin.Tiu | All rights reserved"
;
Rss.RssChannel channel =
new
Rss.RssChannel()
{
Title = title,
Link = link,
Description = desc,
PubDate = now,
LastBuildDate = now,
Language =
"zh-cn"
,
WebMaster = email,
ManagingEditor = email,
Copyright = copyRight
};
return
channel;
}
|
以上!
PS:关于RSS的介绍在W3CSchool上面已经介绍的比较详细,以下是本文内容有关的参考资料地址。
W3CSchool-XML-RSS : http://www.w3school.com.cn/rss/index.asp
RSS.NET组件官方地址: http://www.rssdotnet.com/
RSS.NET组件下载地址: http://www.rssdotnet.com/RSS.NET.tar.gz