看如何用Visual C#制作新聞閱讀器
用Visual C#制作新聞閱讀器:弄清結(jié)構(gòu)再動手
要想輕松的抽取RSS信息,自然先要了解它的結(jié)構(gòu),所謂“知己知彼,百戰(zhàn)不殆”嘛。
1、RSS的結(jié)構(gòu)
我們先打開百度新聞一個RSS鏈接,如果你再多打開幾個別的網(wǎng)站的RSS鏈接,會發(fā)現(xiàn)他們都有大致相同的結(jié)構(gòu)。而我們在揭秘RSS(上)中為大家講解的其實就是編成實現(xiàn)這樣的一個XML文件。
為了能夠方便地對這樣的XML文檔進(jìn)行處理,在本文里,我們使用C#作為開發(fā)的語言。
分析整個RSS鏈接后,我們知道RSS大致的結(jié)構(gòu)入圖1。
2、抽取的原理
知道了結(jié)構(gòu),我們還要知道結(jié)構(gòu)中各部分的含義。在圖1中RSS節(jié)點表示當(dāng)前是一個RSS文件,它由一個CHANNEL節(jié)點及其子節(jié)點組成,其中一些子節(jié)點提供關(guān)于頻道本身的信息,比如title表示頻道的名稱(“百度互聯(lián)網(wǎng)新聞”)。
CHANNEL節(jié)點又包含多個ITEM子節(jié)點,而ITEM節(jié)點就是程序需要處理的部分,因為它對應(yīng)著每條實際的新聞項信息, 每個ITEM節(jié)點又通過其子節(jié)點提供關(guān)于這條新聞的詳細(xì)信息,比如title表示新聞的標(biāo)題(“微軟IM稱王”),link對應(yīng)新聞實際的鏈接。
RSS具體規(guī)范可查看http://blogs.law.harvard.edu/tech/rss
知道了這些后,要編程就不困難啦。我們只需提取并顯示出CHANNEL和ITEM下的各條信息就可以了?,F(xiàn)在來看看具體的實現(xiàn)方法吧。
用Visual C#制作新聞閱讀器:做個程序讀新聞
對RSS有一定了解后,我們開始編寫程序。先還是需要一個最簡單的界面。新建一個Win Form 工程,在Form上放置一個Label,一個文本框txtURL用來輸入RSS鏈接(就是各網(wǎng)站RSS鏈接中包含的地址),一個按鈕bnRead用來執(zhí)行讀取新聞, 一個TreeView樹形控件treeRSS顯示讀出的新聞項。
1、定義裝載結(jié)構(gòu)
根據(jù)上面分析的RSS結(jié)構(gòu),我們首先來建立一個rss類,用它來裝載RSS鏈接中CHANNEL和ITEM的各條信息。代碼如下:
- public class rss
- {
- public struct Channel
- {
- public string Title;
- public Hashtable Items;
- }
- public struct Item
- {
- public string Title;
- public string Description;
- public string Link;
- }
- }
Channel結(jié)構(gòu)將存儲CHANNEL節(jié)點包含的所有子節(jié)點信息,其中Items成員字段是一個Hashtable集合,程序會將Item結(jié)構(gòu)作為對象加入集合,用來存儲Channel下的所有Item節(jié)點。這里我只讀取了有限的幾個節(jié)點,讀者可以根據(jù)實際需要擴(kuò)展整個結(jié)構(gòu)定義。
2、從RSS鏈接中獲取新聞信息
現(xiàn)在我們就可以開始編寫讀取函數(shù),將抽取出的RSS信息放入上面設(shè)計好的結(jié)構(gòu)中。
C#提供了專門的類來訪問XML, 使我們能夠輕松地讀出RSS的內(nèi)容。代碼如下:
- XmlTextReader Reader = new XmlTextReader(URL);
- XmlValidatingReader Valid = new XmlValidatingReader(Reader);
- Valid.ValidationType = ValidationType.None;
- XmlDocument xmlDoc= new XmlDocument();
- xmlDoc.Load(Reader);
使用XmlDocument類將txtURL中輸入的RSS鏈接加載后,首先通過FoundChildNode函數(shù),找到Channel節(jié)點。
- private XmlNode FoundChildNode(XmlNode Node,string Name)
- {
- XmlNode childlNode = null;
- for (int i=0;i < Node.ChildNodes.Count;i++)
- {
- if ( Node.ChildNodes[i].Name == Name && Node.ChildNodes[i].ChildNodes.Count > 0 )
- {
- childlNode = Node.ChildNodes[i];
- return childlNode;
- }
- }
- return childlNode;
- }
- XmlNode rssNode = FoundChildNode(xmlDoc,"rss");
- XmlNode channelNode = FoundChildNode(rssNode,"channel");
然后我們就可以遍歷它的子節(jié)點,根據(jù)子節(jié)點的Name屬性,讀取我們需要的信息。
- rss.Channel channel=new rss.Channel();
- channel.Items=new Hashtable();
- {
- switch ( channelNode.ChildNodes[i].Name )
- {
- case "title":
- {
- channel.Title = channelNode.ChildNodes[i].InnerText;
- break;
- }
- case "item":
- {
- rss.Item item=this.getRssItem(channelNode.ChildNodes[i]);
- channel.Items.Add(channel.Items.Count,item );
- break;
- }
- }
- }
如果發(fā)現(xiàn)是item子節(jié)點,就調(diào)用getRssItem函數(shù),同樣通過遍歷子節(jié)點的方法,將其子節(jié)點內(nèi)容填入Item結(jié)構(gòu)中,然后再添加到Channel結(jié)構(gòu)的Items集合中。因為本程序并不關(guān)心添加到集合的鍵值,只需要它是不重復(fù)的值,所以我傳入了Count屬性。
3.將讀出的信息顯示在程序中
將RSS內(nèi)容讀出后,就需要把信息展示給用戶了。我們這里用的是基本的TreeView方法,通過遍歷Channel結(jié)構(gòu)的Items集合,將其標(biāo)題添加到TreeView中。
- private void ViewRss(rss.Channel channel)
- {
- treeRss.BeginUpdate();
- treeRss.Nodes.Clear();
- TreeNode channelNode=treeRss.Nodes.Add(channel.Title );
- channelNode.Tag="";
- for (int i=0;i < channel.Items.Count ;i++)
- {
- rss.Item item=(rss.Item)channel.Items[i];
- TreeNode itemNode=channelNode.Nodes.Add(item.Title );
- itemNode.Tag=item.Link;
- }
- treeRss.ExpandAll();
- treeRss.EndUpdate();
- }
同時我們還可以設(shè)置TreeView的每個子節(jié)點的Tag屬性為它對應(yīng)的鏈接。以便當(dāng)選中子節(jié)點時就可以通過讀取Tag屬性訪問具體的信息。
- private void treeRss_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
- {
- TreeNode itemNode=e.Node ;
- string URL=itemNode.Tag.ToString();
- if (URL.Length!=0)
- System.Diagnostics.Process.Start( URL);
- }
程序運(yùn)行效果如圖2。
用Visual C#制作新聞閱讀器:小結(jié)
怎么樣,一個簡單的RSS新聞閱讀器就按前面所說輕松完成了,容易吧。雖然它還有很多不足,但如果大家通過這個例子學(xué)會了抽取RSS鏈接信息的基本方法,那就足夠了!
【編輯推薦】