开源的C#组件——RSS.NET
?? ?之前為了給博客加上RSS功能便了解了一下RSS的相關(guān)。小研究了一些RSS是什么、怎么用、有什么規(guī)范之后在網(wǎng)上找到很多別人封裝的RSS操作類,但是都覺得似乎有點(diǎn)簡單了,而且很多代碼寫得很死,于是打算研究清楚后自己寫個(gè)RSS組件來完成工作,后來在同事介紹了一個(gè)外國的開源RSS組件開源項(xiàng)目,寫得實(shí)在是好,于是下載了源碼來學(xué)習(xí),并且使用到自己的博客里面,下載的版本不知道是不是最新的,使用的時(shí)候做了點(diǎn)微型的修改。網(wǎng)上有不少文件介紹RSS的,這篇文章我試圖用自己的話介紹一下我自己的理解,順便和大家分享RSS.NET這個(gè)優(yōu)秀的組件 ^_^
?? ?我博客上該文章的地址:http://www.youguanbumen.net/Article.aspx?id=67
?? ?首先了解一下RSS是什么,有什么用,然后了解如何用,有什么可以方法可以節(jié)省我們的開發(fā)和學(xué)習(xí)成本:
?? ?RSS是什么,按照我個(gè)人的理解RSS是一個(gè)xml格式的字符串,這個(gè)字符串通過一個(gè)url地址來獲取(這個(gè)地址可能是一個(gè)格式的文本文件、或者是一個(gè)動(dòng)態(tài)網(wǎng)頁或者能動(dòng)態(tài)生成需要的文本的東東- -!),必須注意的是,xml的格式是被固定下來的,有自己的一套節(jié)點(diǎn)和節(jié)點(diǎn)屬性定義(根據(jù)不同的版本會(huì)有不同的規(guī)范),哪些節(jié)點(diǎn)是必須有的,那些可有可無都是被規(guī)定下來的。
?? ?RSS有什么用,簡單來說就是通過RSS閱讀器(IE、FF等瀏覽器本身就是,強(qiáng)力些的可以用outlook)收藏你喜歡的RSS(成為RssFeed),閱讀RSS,RSS更新的時(shí)候會(huì)主動(dòng)通知你。我發(fā)現(xiàn)我試圖說明白但是似乎說不明白,下面是在W3CSchool抄下來的:
-
- 通過使用 RSS,您可以有選擇地瀏覽您感興趣的以及與您的工作相關(guān)的新聞。
- 通過使用 RSS,您可以把需要的信息從不需要的信息(兜售信息,垃圾郵件等)中分離出來。
- 通過使用 RSS,您可以創(chuàng)建自己的新聞?lì)l道,并將之發(fā)布到因特網(wǎng)。
?? ?RSS怎么使用,對(duì)于發(fā)布RSS的人(準(zhǔn)確來說應(yīng)該是代碼人員)需要通過編寫代碼等途徑把網(wǎng)站中希望推送給那些訂閱你這個(gè)RSS的用戶(可能是你網(wǎng)絡(luò)上的好友、商業(yè)上的伙伴甚至是敵人)。所謂推送就是寫好一個(gè)符合RSS格式的XML文件(當(dāng)然可以用一個(gè)動(dòng)態(tài)頁面或者一個(gè)asp.net的一般處理程序,都行!),給出一個(gè)URL地址來訪問這個(gè)文件(例如我的網(wǎng)站RSS地址是http://www.youguanbumen.net/Rss/feed.xml),需要訂閱你這個(gè)RSS的用戶可以通過這個(gè)地址獲取到這個(gè)RSS了,至于他們?cè)趺从?#xff0c;這個(gè)就不管了。對(duì)于使用RSS的人來說,可以找一個(gè)自己喜歡的RSS閱讀器訂閱自己的喜歡的RSS,如果是自己編碼實(shí)現(xiàn)RSS閱讀的話,大致做法就是通過代碼去把自己喜歡的RSS從指定地址讀取下來,然后按照RSS格式去解析它(讀取到的是一個(gè)xml字符串),要怎么顯示就看個(gè)人喜歡了^_^
?? ?節(jié)省開發(fā)和學(xué)習(xí)成本,學(xué)習(xí)技術(shù)上的東西,最簡介的方法是看文檔,當(dāng)然最好是中文的并且翻譯得專業(yè)點(diǎn)的;減少開發(fā)成本的話一般是找現(xiàn)成的東西,不過還是那句話,用別人的東西最好不要拿來就立刻用,特別是開源的東西,最好看一下別人怎么寫,整體看一下也好,這對(duì)靈活地使用已經(jīng)日后可能的擴(kuò)展都是很有幫助的,并且有可能在看的過程中能吸收到一些好的編碼技巧。這里我找了RSS.NET這個(gè)組件。
????RSS.NET組件:
?? ?這個(gè)組件主要做的事情其實(shí)不多,就是讀取和生成RSS,不過是以面向?qū)ο蟮乃枷氚裄SS中的各個(gè)元素(xml節(jié)點(diǎn))做成對(duì)象,在使用的時(shí)候我們只需要知道RSS的地址和版本,然后調(diào)用這個(gè)組件的相關(guān)方法讀取這個(gè)RSS,得到的不是一個(gè)需要我們?nèi)ソ馕龅膞ml字符串,而是這個(gè)組件為我們提供的對(duì)象(一個(gè)RssFeed類對(duì)象),以對(duì)象-屬性的形式我們可以讀取一個(gè)RSSChannel,在Channel中讀取到RssItem集合,接著很方便地在代碼里面讀取RSS的各個(gè)元素,按照自己的需要對(duì)內(nèi)容進(jìn)行數(shù)據(jù)呈現(xiàn),這一過程和我們?cè)谟?NET給我們提供的類(例如和數(shù)據(jù)庫訪問有關(guān)的類)一樣方便。生成RSS是一個(gè)逆向的過程,我們要做的是創(chuàng)建需要的對(duì)象(這些對(duì)象由該組件提供),一般做法是實(shí)例化一個(gè)RssFeed類對(duì)象,給他添加RSSChannel,給RSSChannel添加RssItem,最后調(diào)用RssFeed的方法生成一個(gè)xml文件或者獲取xml字符串然后自己處理(這是個(gè)符合RSS格式的xml字符串)。
?? ?下面節(jié)選一段我博客里面的代碼,完成生成RSS的工作(生成一個(gè)xml文件),只是一個(gè)代碼片段(關(guān)于這個(gè)組件的時(shí)候文章最后給出官方網(wǎng)站的地址和下載地址)
?
| /// <summary> /// 創(chuàng)建Rss文件 /// </summary> /// <param name="fileName">文件全路徑(物理路徑)</param> /// <param name="isAutoUpdate">是否是系統(tǒng)自動(dòng)更新</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) ????????{ ????????????// 沒有文章,直接返回結(jié)果(沒有內(nèi)容) ????????????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); ????????// 創(chuàng)建RssFeed ????????Rss.RssFeed feed = new Rss.RssFeed(System.Text.Encoding.UTF8); ????????// 創(chuàng)建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> /// 創(chuàng)建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> /// 創(chuàng)建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:關(guān)于RSS的介紹在W3CSchool上面已經(jīng)介紹的比較詳細(xì),以下是本文內(nèi)容有關(guān)的參考資料地址。
?? ? ? ?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
轉(zhuǎn)載于:https://www.cnblogs.com/serafin/archive/2011/01/09/1931172.html
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的开源的C#组件——RSS.NET的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SCSF 系列:Smart Client
- 下一篇: 终于有人把数据、信息、知识讲明白了