新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML网站展示,XML源代码,XML编程示例。 本版仅接受原创、转贴、网站展示,具体的技术交流请前往各相关版块。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XML源码及示例(仅原创和转载) 』 → 实例:用Visual C#制作新闻阅读器 [转载] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 8333 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 实例:用Visual C#制作新闻阅读器 [转载] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     supremeweb 帅哥哟,离线,有人找我吗?
      
      
      等级:大三(要不要学学XML呢?)
      文章:87
      积分:661
      门派:XML.ORG.CN
      注册:2006/6/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给supremeweb发送一个短消息 把supremeweb加入好友 查看supremeweb的个人资料 搜索supremeweb在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看supremeweb的博客楼主
    发贴心情 实例:用Visual C#制作新闻阅读器 [转载]

      一、弄清结构再动手

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

      1、RSS的结构

      我们先打开[URL=http://com.chinabyte.com/baidu/]百度[/URL]新闻一个RSS链接,如果你再多打开几个别的网站的RSS链接,会发现他们都有大致相同的结构。而我们在揭秘RSS(上)中为大家讲解的其实就是编成实现这样的一个[URL=http://dev.21tx.com/dotnet/xml/]XML[/URL]文件。

      为了能够方便地对这样的[URL=http://dev.21tx.com/web/xml/]XML[/URL]文档进行处理,在本文里,我们使用[URL=http://dev.21tx.com/dotnet/csharp/]C#[/URL]作为开发的语言。

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

    按此在新窗口浏览图片

      2、抽取的原理

      知道了结构,我们还要知道结构中各部分的含义。在图1中RSS节点表示当前是一个RSS文件,它由一个[URL=http://searchwhatis.techtarget.com.cn/searchwhatis/141/1947141.shtml]CHANNEL[/URL]节点及其子节点组成,其中一些子节点提供关于频道本身的信息,比如title表示频道的名称(“百度[URL=http://news.21tx.com/net/]互联网[/URL]新闻”)。

      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#提供了专门的类来访问[URL=http://searchwhatis.techtarget.com.cn/searchwhatis/203/1949203.shtml]XML[/URL], 使我们能够轻松地读出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链接信息的基本方法,那就足够了!


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/5/9 10:41:00
     
     Qr 帅哥哟,离线,有人找我吗?
      
      
      威望:9
      等级:博士二年级(版主)
      文章:4392
      积分:29981
      门派:XML.ORG.CN
      注册:2004/5/15

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Qr发送一个短消息 把Qr加入好友 查看Qr的个人资料 搜索Qr在『 XML源码及示例(仅原创和转载) 』的所有贴子 访问Qr的主页 引用回复这个贴子 回复这个贴子 查看Qr的博客2
    发贴心情 
    不错。

    ----------------------------------------------
    没人帮忙,那就靠自己,自己才是最好的老师!本人拒绝回答通过站内短消息提出的问题!

    blog:http://Qr.blogger.org.cn

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/5/10 16:48:00
     
     lovesky20008 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:4
      积分:75
      门派:XML.ORG.CN
      注册:2007/5/19

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给lovesky20008发送一个短消息 把lovesky20008加入好友 查看lovesky20008的个人资料 搜索lovesky20008在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看lovesky20008的博客3
    发贴心情 
    好东西。谢谢了啊
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/5/19 23:43:00
     
     龙藤 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:22
      积分:161
      门派:XML.ORG.CN
      注册:2006/4/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给龙藤发送一个短消息 把龙藤加入好友 查看龙藤的个人资料 搜索龙藤在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看龙藤的博客4
    发贴心情 
    谢谢!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/6/25 22:22:00
     
     依窗听雨 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:8
      积分:87
      门派:XML.ORG.CN
      注册:2007/7/26

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给依窗听雨发送一个短消息 把依窗听雨加入好友 查看依窗听雨的个人资料 搜索依窗听雨在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看依窗听雨的博客5
    发贴心情 
    这个程序不错 实验一下。。。。
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/7/26 19:43:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML源码及示例(仅原创和转载) 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/28 19:59:58

    本主题贴数5,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    78.125ms