這篇文章運用簡單易懂的例子給大家介紹C#調(diào)用API生成RSS資源文件的方法,代碼非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比衡山網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式衡山網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋衡山地區(qū)。費用合理售后完善,十載實體公司更值得信賴。
RSS就是簡易信息聚合(也叫聚合內(nèi)容),是一種RSS基于XML標準,在互聯(lián)網(wǎng)上被廣泛采用的內(nèi)容包裝和投遞協(xié)議。RSS(Really Simple Syndication)是一種描述和同步網(wǎng)站內(nèi)容的格式,是使用最廣泛的XML應(yīng)用。RSS搭建了信息迅速傳播的一個技術(shù)平臺,使得每個人都成為潛在的信息提供者。發(fā)布一個RSS文件后,這個RSS Feed中包含的信息就能直接被其他站點調(diào)用,而且由于這些數(shù)據(jù)都是標準的XML格式,所以也能在其他的終端和服務(wù)中使用,是一種描述和同步網(wǎng)站內(nèi)容的格式。
1.新浪微博RSS訂閱第三方網(wǎng)站
新浪微博本身沒有提供RSS訂閱,但是到網(wǎng)上搜索,發(fā)現(xiàn)了一個第三方的網(wǎng)站,提供新浪微博的RSS資源,所以,本文的RSS訂閱說白了都是基于這個第三方網(wǎng)站的。
log.medcl.net/item/2010/02/sina-bo-rss-subscribe-feed-generate-micro/
2.網(wǎng)上通用的OPML文件的XML格式
下面是從Google Reader中導(dǎo)出的opml文件,這是網(wǎng)絡(luò)RSS閱讀器甚至所有RSS閱讀器的標準格式吧,至少“鮮果”,“有道”這些比較流行的在線閱讀器都支持這個格式的文件導(dǎo)入。
|
分析OPML文件的架構(gòu),然后方便通過程序來將它需要的信息寫成此架構(gòu)的文件,便于閱讀器引用。 OPML文件由頭部標簽
(主要是本文件的一些注釋,不影響實際的RSS訂閱信息,不是太重要)和(RSS閱讀器提取訂閱資源的全部數(shù)據(jù)來源)。在節(jié)點下面有個一級的3.新浪微博API――從服務(wù)器上導(dǎo)出用戶好友數(shù)據(jù)到本地XML文件
下面是自己整理的代碼,從服務(wù)器上請求用戶的好友信息:
private void getFriends() { int previous_cursor=-1; int next_cursor = -1; while (next_cursor != 0) { string cursor = Convert.ToString(previous_cursor); string url = " http://api.t.sina.com.cn/statuses/friends.xml?source=AppKey&cursor=" + cursor; string username = "dreamzsm@gmail.com"; string password = name; //這里輸入你自己微博登錄的的密碼 //注意這里的格式哦,為 "username:password" System.Net.WebRequest webRequest = System.Net.WebRequest.Create(url); System.Net.HttpWebRequest myReq = webRequest as System.Net.HttpWebRequest; //身份驗證 string usernamePassword = username + ":" + password; CredentialCache mycache = new CredentialCache(); mycache.Add(new Uri(url), "Basic", new NetworkCredential(username, password)); myReq.Credentials = mycache; myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword))); WebResponse wr = myReq.GetResponse(); Stream receiveStream = wr.GetResponseStream(); StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8); string content = reader.ReadToEnd(); XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml(content); // xmlDoc.Load("data1.xml"); XmlNodeList nodeList = xmlDoc.SelectSingleNode("users").ChildNodes;//獲取根節(jié)點的所有子節(jié)點 next_cursor = Convert.ToInt16(nodeList.Item(nodeList.Count - 2).InnerText); previous_cursor = Convert.ToInt16(nodeList.Item(nodeList.Count-1).InnerText); string xmlName = "friends_" + nodeList.Item(nodeList.Count - 1).InnerText + "_" + Convert.ToInt16(nodeList.Item(nodeList.Count - 2).InnerText) + ".xml"; previous_cursor = next_cursor; xmlDoc.Save(xmlName); } } |
為了程序設(shè)計簡單一點,筆者就有點偷懶了,沒有仔細研究如何將所有的數(shù)據(jù)寫到一個XML文件中,而是每次請求得到的20條數(shù)據(jù)寫成一個XML文件,最后我159個好友,按照指定的命名方法生成了8個XML文件。
如此,就得到了所有的你的好友(就是你跟隨的人)的信息了,以單人為例,其主要信息如下:
|
可以看到這里面的信息量是超級多的,我簡單介紹下幾個主要的節(jié)點吧
id | 用戶新浪微博的數(shù)字ID,就像你的QQ號一樣 |
name | 用戶昵稱 |
province | 省代號 |
city | 市代號 |
location | 所在省市(好像和上面兩個節(jié)點重復(fù)了) |
description | 自我描述 |
domain | 域名,就是除了數(shù)字ID后,用戶申請的修改域名 |
gender | 性別。男的是Male,女的是Female. |
followers_count | 粉絲數(shù) |
friends_count | 跟隨的人數(shù) |
statuses_count | 發(fā)表的狀態(tài)也就是微博數(shù) |
favourites_count | 收藏微博數(shù)目吧?(不知道這個有什么用) |
created_at | 用戶創(chuàng)建此微博客的時間 |
verified | 是否經(jīng)過新浪的VIP認證 |
status | 用戶最近的一次狀態(tài) |
除了user信息外,還有一些其它信息,比如根節(jié)點下的next_cursor和previous_cousor,這方便用戶分多次到服務(wù)器上請求數(shù)據(jù)時可以此作為定位依據(jù)。
4.將XML文件存儲到ACCESS數(shù)據(jù)庫中進行備份
如果不想備份的可以直接從第3步中到第5步,但是筆者,覺得將數(shù)據(jù)轉(zhuǎn)換成此構(gòu)架后,更加方便后來的程序操作以及瀏覽數(shù)據(jù)。
關(guān)于XML的詳細方法參考:小氣的鬼
《在C#.net中如何操作XML》
www.cnblogs.com/weekzero/archive/2005/06/21/178140.html
下面開始讀取剛才從新浪微博服務(wù)器上請求得到的XML文件了。然后轉(zhuǎn)換成ACCESS數(shù)據(jù)庫內(nèi)容。(當然你要先用ACCESS在指定目錄下建立一個*.mdb文件用來存儲數(shù)據(jù))
下面是對單個XML文件進行讀取,并插入到數(shù)據(jù)庫中(這段代碼是在ASP.NET中寫的)
public void readTsinaFriends(string fileName) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Server.MapPath(fileName)); XmlNodeList nodeList = xmlDoc.SelectSingleNode("users").ChildNodes;//獲取 根節(jié)點的所有子節(jié)點 ; //刪除不用的一級節(jié)點,比如提示人數(shù)的所在位置的標記 XmlNode root = xmlDoc.SelectSingleNode("users"); // XmlNodeList xnl = xmlDoc.SelectSingleNode("Employees").ChildNodes; for (int k = 0; k < nodeList.Count; k++) { XmlElement xe = (XmlElement)nodeList.Item(k); if(xe.Name=="user") {//去掉XML文件中不需要的節(jié)點:next_cursor,previous_coursor以及user節(jié)點中的status,方便XML直接轉(zhuǎn)換成DataTable XmlNodeList nodeList1 = xmlDoc.SelectNodes("users/user");//得到所有的標簽user一級節(jié)點 foreach (XmlNode xmlNodeTemp in nodeList1) { if (xmlNodeTemp.LastChild.Name == "status")//移除每個user節(jié)點中的"status"子節(jié)點--(一般情況下此節(jié)點都放在最后一個,所以就不遍歷了,直接地址定位) { xmlNodeTemp.RemoveChild(xmlNodeTemp.LastChild); } } } else if (xe.Name == "next_cursor" || xe.Name == "previous_cursor") { root.RemoveChild(xe); if (k < nodeList.Count) k = k - 1; } } string tbxml = xmlDoc.OuterXml; DataTable dt = new DataTable(); DataSet ds = new DataSet(); System.IO.StringReader reader = new System.IO.StringReader(tbxml); ds.ReadXml(reader); dt = ds.Tables[0];//如果XML文本中有同名的父子節(jié)點,那么此語句就會多讀出一條數(shù)據(jù),這可能是此API函數(shù)的局限性吧 DataTable dtCopy = dt.Copy(); //dtCopy.Columns.Remove("url"); //dtCopy.Columns.Remove("profile_image_url"); dtCopy.Columns.Remove("description"); //這個字段里面字符編碼不太規(guī)則,在插入ACCESS的時候總有問題,而且用處不大,所以就去除了。(又偷懶了呃) DataRow drTemp = dtCopy.NewRow(); string strInsert = string.Empty; OleDbConnection aConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\\coursware\\網(wǎng)絡(luò)軟文\\API_微波\\weibo.mdb"); aConnection.Open(); for (int i = 0; i < dtCopy.Rows.Count - 1; i++) { drTemp = dtCopy.Rows[i]; strInsert = "'"+drTemp[0].ToString()+"','"; for (int j = 1; j < dtCopy.Columns.Count - 1; j++) { strInsert += (drTemp[j].ToString() + "','"); } strInsert += drTemp[dtCopy.Columns.Count - 1].ToString() + "'"; string strCmd = "INSERT INTO Friends VALUES(" + strInsert + ")"; OleDbCommand command = new OleDbCommand(strCmd, aConnection); command.ExecuteNonQuery(); } aConnection.Close(); } |
對多個XML文件進行遍歷,一個個導(dǎo)入到ACCESS數(shù)據(jù)庫中:
/// |
經(jīng)過上面的操作后,你再打開你的ACCESS數(shù)據(jù)庫文件weibo.mdb文件中對應(yīng)的表,就可以看到所以的信息都已經(jīng)導(dǎo)入到ACCESS中了。如下圖所示:
5.對ACCESS數(shù)據(jù)庫查詢并寫成RSS閱讀器的OPML格式
對于制作RSS閱讀器的OPML格式,需要的數(shù)據(jù)只有兩條字段:一個是id字段,一個是name字段。
這個過程實際上就是對數(shù)據(jù)進行XML編碼的過程,啥都不說了,一切都在代碼中了(也是在ASP.NET工程中寫的):
/// |
最后在指定的目錄下,程序就自動生成了一個RssReader.xml的文件了。大功告成了!
然后將此文件就可以導(dǎo)入到任何一個RSS閱讀器中了,用戶就能夠通過RSS閱讀器來獲取微博信息了,而且現(xiàn)在的RSS閱讀器都有個一鍵轉(zhuǎn)貼到微博的功能,很方便的,不想轉(zhuǎn)到自己微博的,也可以通過RSS閱讀器直接收藏到閱讀器中。辛苦了兩天,今天能有這么一點小成果,還是覺得很不錯的,呵呵,也祝大家也能好運。本次代碼比較還需要各種完善,比如,如何將所以的數(shù)據(jù)寫成一個XML文件,這個筆者就暫時不做了,留給大家去做吧。
Rss閱讀器效果圖如下:
關(guān)于C#調(diào)用API生成RSS資源文件的方法就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。