看如何用Visual C
创始人
2024-05-04 13:50:13
0

用Visual C#制作新闻阅读器:弄清结构再动手

要想轻松的抽取RSS信息,自然先要了解它的结构,所谓“知己知彼,百战不殆”嘛。

1、RSS的结构

我们先打开百度新闻一个RSS链接,如果你再多打开几个别的网站的RSS链接,会发现他们都有大致相同的结构。而我们在揭秘RSS(上)中为大家讲解的其实就是编成实现这样的一个XML文件。

为了能够方便地对这样的XML文档进行处理,在本文里,我们使用C#作为开发的语言。

分析整个RSS链接后,我们知道RSS大致的结构入图1。

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下的各条信息就可以了。现在来看看具体的实现方法吧。

用Visual C#制作新闻阅读器:做个程序读新闻

对RSS有一定了解后,我们开始编写程序。先还是需要一个最简单的界面。新建一个Win Form 工程,在Form上放置一个Label,一个文本框txtURL用来输入RSS链接(就是各网站RSS链接中包含的地址),一个按钮bnRead用来执行读取新闻, 一个TreeView树形控件treeRSS显示读出的新闻项。

1、定义装载结构

根据上面分析的RSS结构,我们首先来建立一个rss类,用它来装载RSS链接中CHANNEL和ITEM的各条信息。代码如下:

  1. public class rss  
  2. {  
  3.  public struct Channel  
  4.  {  
  5.   public string Title;  
  6.   public Hashtable Items;  
  7.  }  
  8.  
  9.  public struct Item  
  10.  {  
  11.   public string Title;  
  12.   public string Description;  
  13.   public string Link;  
  14.  }  
  15. }  

Channel结构将存储CHANNEL节点包含的所有子节点信息,其中Items成员字段是一个Hashtable集合,程序会将Item结构作为对象加入集合,用来存储Channel下的所有Item节点。这里我只读取了有限的几个节点,读者可以根据实际需要扩展整个结构定义。

2、从RSS链接中获取新闻信息

现在我们就可以开始编写读取函数,将抽取出的RSS信息放入上面设计好的结构中。

C#提供了专门的类来访问XML, 使我们能够轻松地读出RSS的内容。代码如下:

  1. XmlTextReader Reader = new XmlTextReader(URL);  
  2. XmlValidatingReader Valid = new XmlValidatingReader(Reader);  
  3. Valid.ValidationType = ValidationType.None;  
  4. XmlDocument xmlDoc= new XmlDocument();  
  5. xmlDoc.Load(Reader);  

使用XmlDocument类将txtURL中输入的RSS链接加载后,首先通过FoundChildNode函数,找到Channel节点。

  1. private XmlNode FoundChildNode(XmlNode Node,string Name)  
  2. {  
  3.  XmlNode childlNode = null;  
  4.  for (int i=0;i <  Node.ChildNodes.Count;i++)  
  5.  {  
  6.   if ( Node.ChildNodes[i].Name == Name && Node.ChildNodes[i].ChildNodes.Count > 0 )  
  7.   {  
  8.    childlNode = Node.ChildNodes[i];  
  9.    return childlNode;  
  10.   }  
  11.  }  
  12.  return childlNode;  
  13. }  
  14. XmlNode rssNode = FoundChildNode(xmlDoc,"rss");  
  15. XmlNode channelNode = FoundChildNode(rssNode,"channel"); 

然后我们就可以遍历它的子节点,根据子节点的Name属性,读取我们需要的信息。

  1. rss.Channel channel=new rss.Channel();  
  2. channel.Items=new Hashtable();  
  3. {  
  4.  switch ( channelNode.ChildNodes[i].Name )  
  5.  {  
  6.   case "title":  
  7.    {  
  8.     channel.Title = channelNode.ChildNodes[i].InnerText;  
  9.     break;  
  10.    }  
  11.   case "item":  
  12.    {  
  13.     rss.Item item=this.getRssItem(channelNode.ChildNodes[i]);  
  14.     channel.Items.Add(channel.Items.Count,item );  
  15.     break;  
  16.    }  
  17.  }  
  18. }  

如果发现是item子节点,就调用getRssItem函数,同样通过遍历子节点的方法,将其子节点内容填入Item结构中,然后再添加到Channel结构的Items集合中。因为本程序并不关心添加到集合的键值,只需要它是不重复的值,所以我传入了Count属性。

3.将读出的信息显示在程序中

将RSS内容读出后,就需要把信息展示给用户了。我们这里用的是基本的TreeView方法,通过遍历Channel结构的Items集合,将其标题添加到TreeView中。

  1. private void ViewRss(rss.Channel channel)  
  2. {  
  3.  treeRss.BeginUpdate();  
  4.  treeRss.Nodes.Clear();  
  5.  TreeNode channelNode=treeRss.Nodes.Add(channel.Title );   
  6.  channelNode.Tag="";  
  7.  for (int i=0;i < channel.Items.Count ;i++)  
  8.  {  
  9.   rss.Item item=(rss.Item)channel.Items[i];  
  10.   TreeNode itemNode=channelNode.Nodes.Add(item.Title );  
  11.   itemNode.Tag=item.Link;  
  12.  }  
  13.  treeRss.ExpandAll();  
  14.  treeRss.EndUpdate();  
  15. }  

同时我们还可以设置TreeView的每个子节点的Tag属性为它对应的链接。以便当选中子节点时就可以通过读取Tag属性访问具体的信息。

  1. private void treeRss_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)  
  2. {  
  3.  TreeNode itemNode=e.Node ;  
  4.  string URL=itemNode.Tag.ToString();  
  5.  if (URL.Length!=0)  
  6.   System.Diagnostics.Process.Start( URL);  
  7. }   
  8.  

程序运行效果如图2。

 程序运行效果如图2

用Visual C#制作新闻阅读器:小结

怎么样,一个简单的RSS新闻阅读器就按前面所说轻松完成了,容易吧。虽然它还有很多不足,但如果大家通过这个例子学会了抽取RSS链接信息的基本方法,那就足够了!

【编辑推荐】

  1. 四种C#参数类型简介
  2. Java与C#的不同之处
  3. 学习C#程序集
  4. C#和ADO.NET建立数据绑定网格
  5. 介绍C# 4.0新特性dynamic

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...