程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 用Visual C#制作新聞閱讀器

用Visual C#制作新聞閱讀器

編輯:關於C語言
一、弄清結構再動手

  要想輕松的抽取RSS信息,自然先要了解它的結構,所謂“知己知彼,百戰不殆”嘛。

  1、RSS的結構

  我們先打開百度新聞一個RSS鏈接,如果你再多打開幾個別的網站的RSS鏈接,會發現他們都有大致相同的結構。而我們在揭秘RSS(上)中為大家講解的其實就是編成實現這樣的一個XML文件。

  為了能夠方便地對這樣的XML文檔進行處理,在本文裡,我們使用C#作為開發的語言。

  分析整個RSS鏈接後,我們知道RSS大致的結構入圖1。


  2、抽取的原理

  知道了結構,我們還要知道結構中各部分的含義。在圖1中RSS節點表示當前是一個RSS文件,它由一個CHANNEL節點及其子節點組成,其中一些子節點提供關於頻道本身的信息,比如title表示頻道的名稱(“百度互聯網新聞”)。

  CHANNEL節點又包含多個ITEM子節點,而ITEM節點就是程序需要處理的部分,因為它對應著每條實際的新聞項信息, 每個ITEM節點又通過其子節點提供關於這條新聞的詳細信息,比如title表示新聞的標題(“微軟IM稱王”),link對應新聞實際的鏈接。

  RSS具體規范可查看http://blogs.law.harvard.edu/tech/rss

  知道了這些後,要編程就不困難啦。我們只需提取並顯示出CHANNEL和ITEM下的各條信息就可以了。現在來看看具體的實現方法吧。

  二.做個程序讀新聞

  對RSS有一定了解後,我們開始編寫程序。先還是需要一個最簡單的界面。新建一個Win Form 工程,在Form上放置一個Label,一個文本框txtURL用來輸入RSS鏈接(就是各網站RSS鏈接中包含的地址),一個按鈕bnRead用來執行讀取新聞, 一個TreeVIEw樹形控件treeRSS顯示讀出的新聞項。

  1、定義裝載結構

  根據上面分析的RSS結構,我們首先來建立一個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結構將存儲CHANNEL節點包含的所有子節點信息,其中Items成員字段是一個Hashtable集合,程序會將Item結構作為對象加入集合,用來存儲Channel下的所有Item節點。這裡我只讀取了有限的幾個節點,讀者可以根據實際需要擴展整個結構定義。

  2、從RSS鏈接中獲取新聞信息

  現在我們就可以開始編寫讀取函數,將抽取出的RSS信息放入上面設計好的結構中。

  C#提供了專門的類來訪問XML, 使我們能夠輕松地讀出RSS的內容。代碼如下:

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函數,找到Channel節點。

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");


然後我們就可以遍歷它的子節點,根據子節點的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;
   }
 }
}

  如果發現是item子節點,就調用getRssItem函數,同樣通過遍歷子節點的方法,將其子節點內容填入Item結構中,然後再添加到Channel結構的Items集合中。因為本程序並不關心添加到集合的鍵值,只需要它是不重復的值,所以我傳入了Count屬性。

  3.將讀出的信息顯示在程序中

  將RSS內容讀出後,就需要把信息展示給用戶了。我們這裡用的是基本的TreeView方法,通過遍歷Channel結構的Items集合,將其標題添加到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();
}

  同時我們還可以設置TreeVIEw的每個子節點的Tag屬性為它對應的鏈接。以便當選中子節點時就可以通過讀取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);
}

  程序運行效果如圖2。


  三.小結

  怎麼樣,一個簡單的RSS新聞閱讀器就按前面所說輕松完成了,容易吧。雖然它還有很多不足,但如果大家通過這個例子學會了抽取RSS鏈接信息的基本方法,那就足夠了!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved