实例:用Visual C#制作新闻阅读器

visual

  一、弄清结构再动手

  要想轻松的抽取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链接信息的基本方法,那就足够了!

时间: 2024-09-12 22:05:36

实例:用Visual C#制作新闻阅读器的相关文章

用Visual C#制作新闻阅读器

visual 一.弄清结构再动手 要想轻松的抽取RSS信息,自然先要了解它的结构,所谓"知己知彼,百战不殆"嘛. 1.RSS的结构 我们先打开百度新闻一个RSS链接,如果你再多打开几个别的网站的RSS链接,会发现他们都有大致相同的结构.而我们在揭秘RSS(上)中为大家讲解的其实就是编成实现这样的一个XML文件. 为了能够方便地对这样的XML文档进行处理,在本文里,我们使用C#作为开发的语言. 分析整个RSS链接后,我们知道RSS大致的结构入图1. 2.抽取的原理 知道了结构,我们还要知

C#制作新闻阅读器

一.弄清结构再动手 要想轻松的抽取RSS信息,自然先要了解它的结构,所谓"知己知彼,百战不殆"嘛. 1.RSS的结构 我们先打开百度新闻一个RSS链接,如果你再多打开几个别的网站的RSS链接,会发现他们都有大致相同的结构.而我们在揭秘RSS(上)中为大家讲解的其实就是编成实现这样的一个XML文件. 为了能够方便地对这样的XML文档进行处理,在本文里,我们使用C#作为开发的语言. 分析整个RSS链接后,我们知道RSS大致的结构入图1. 2.抽取的原理 知道了结构,我们还要知道结构中各部分

android仿新闻阅读器菜单弹出效果实例(附源码DEMO下载)_Android

开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO. 原本觉得是最后完成后发网站客户端的,可是这样体现不出一个功能一个功能的分析实现效果,而且周期时间长,所以就完成一部分,发一部分,敬请谅解. 下面的菜单弹出效果在很多的新闻阅读器上都有,比如今日头条.360新闻等. 其实这个实现起来很简单,看其效果,其实就是一个PopupWindow,之后设定相应postion的按钮点击属性,之后获取按钮的位置,给它设置动画显示消失就可以出现了. 下

多方夹击,新闻阅读器面临不幸

今天凌晨,我收到一封邮件,提示我曾经玩过的一款新闻阅读器Flud即将停止服务.这家公司在运营了3年之后无疾而终. Flud最早是专注于iOS的新闻阅读器,2年前曾推出一个短命的Android版本,后来在2012年4月重新推出WP和Android版本.当时,它在Flipboard.Pulse等同类产品的夹击中,为自己寻找的道路是:建设一个新闻读者的内部社交网络,而不是把文章分享到Facebook或Twitter. 尽管创始人鲍比·戈沙尔自信的表示,他们的用户更愿意分享到内部社交网络,但运营事实证明

jQuery Mobile开发的新闻阅读器,适应iphone和android手机

程序员都很赖,你懂的! 我们经常上新浪,腾讯,雅虎等各大网站上面看新闻,他们也都各自推出了自家的手机新闻阅读器.今天我自己使用jQuery Mobile 来实现这一功能.图片大小上传限制了大小250*400先看看iphone上的效果: 再看看android上的效果: OK,非常完美,是我想要的结果.直接上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.or

android高仿今日头条 --新闻阅读器

开发流程 第一篇:(android高仿系列)今日头条 --新闻阅读器 (一) 涉及到的知识点有 1.slidingmenu.lib  (侧拉菜单包)   使用方法配置以及下载:点击这里   实现:客户端中左右2边侧拉菜单 2.命名规范可以参考:android命名规范   实现:源码中包.类.方法名称的统一 3.如何反编译:反编译就这么简单   实现:客户端中资源文件的获取 4.Fragment以及HorizontalScrollView的使用,以及重写HorizontalScrollView  

tin 2.0.0发布 文本模式新闻阅读器

tin是一个http://www.aliyun.com/zixun/aggregation/17547.html">功能强大的文本模式新闻阅读器.其功能是线程新闻阅读,正则表达式驱动killfiles/信息的选择,PGP加密,ispell支持,支持从本地和远程NNTP服务器读取信息. 官方网址:http://www.tin.org/ tin 2.0.0版本修复了几个显示的问题,添加新的ccTLD和IDN ccTLD到有效的TLDs列表,添加命令行开关使IPv4或IPv6连接. 下载地址:f

【硅谷连线】Facebook将推新闻阅读器 Radionomy正式收购Winamp

中云网每天连线硅谷,呈现最新鲜资讯!这里的"硅谷"指的是国外具有典型性和创新性企业代表. 1. Tesla召回2.9万Model S充电器:存起火隐患 http://tech.ifeng.com/it/detail_2014_01/15/33026449_0.shtml 北京时间1月15日消息,据科技博客ReCode报道,Tesla上周末致信美国国家公路交通安全管理局称,该公司正在召回逾2.9万个Model S电动汽车充电器,原因是这些充电器存在起火隐患. Tesla表示,当充电器对M

新闻阅读器Pulse借Kindle热卖用户数将超千万

新浪科技讯 北京时间11月16日晚间消息,RSS新闻阅读器Pulse联合创始人阿克沙伊·科塔里(Akshay Kothari)周二表示,Pulse用户数量今年年底前有望超过1000万. Kindle Fire平板电脑本周一正式开售,在内置的为数不多的几项应用中,Pulse就位列其中.这相当于Pulse已经成为Kindle Fire的官方阅读器. Kindle Fire采用Android系统,售价仅200美元,上市后便赢得了消费者和分析人士的认可.许多分析师预计,Kindle Fire年底前销量有