惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 司徒正美
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
MongoDB | Blog
MongoDB | Blog
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
D
Docker
S
Secure Thoughts
B
Blog
M
MIT News - Artificial intelligence
P
Privacy International News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
A
Arctic Wolf
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
SegmentFault 最新的问题
WordPress大学
WordPress大学
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Tenable Blog
Last Week in AI
Last Week in AI
A
About on SuperTechFans
T
Tor Project blog
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
月光博客
月光博客
L
Lohrmann on Cybersecurity
Security Latest
Security Latest
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
P
Privacy & Cybersecurity Law Blog
Spread Privacy
Spread Privacy
AWS News Blog
AWS News Blog
P
Proofpoint News Feed
云风的 BLOG
云风的 BLOG
小众软件
小众软件
宝玉的分享
宝玉的分享
量子位
Forbes - Security
Forbes - Security
T
Threatpost
Google DeepMind News
Google DeepMind News
T
Threat Research - Cisco Blogs
H
Help Net Security
Help Net Security
Help Net Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
T
Troy Hunt's Blog
SecWiki News
SecWiki News
I
InfoQ
C
Cyber Attacks, Cyber Crime and Cyber Security
Stack Overflow Blog
Stack Overflow Blog

博客园 - asdsd

js收藏 - asdsd - 博客园 ArrayList最佳使用建议 右下角弹出消息 用js限制用户输入字节个数 - asdsd - 博客园 数据岛与分页 滚动条的设置 SQL中CONVERT转化函数的用法 js实现自动全屏幕 - asdsd - 博客园 迅速返回页面顶部代码 - asdsd - 博客园 图示元素的clientTop、offsetTop、offsetHeight等属性 新浪天气-模拟 揭开正则表达式 javascript中获取radiobuttonlist选中值 开发时碰到的问题以及心得经验 经常用到的javaScript技术 一劳永逸 让你与IE弹出窗口彻底告别 随机排1-100数字 判断一个对象是否存在 遮挡的问题
用C#制作新闻阅读器(电脑报2005年3月14日 第10期)
asdsd · 2006-10-20 · via 博客园 - asdsd

一。弄清结构再动手
    要想轻松的抽取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
    知道了这些后,要编程就不困难啦。我们只需提取并显示出CHANNELITEM下的各条信息就可以了。现在来看看具体的实现方法吧。

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

    1。定义装载结构
根据上面分析的RSS结构,我们首先来建立一个rss类,用它来装载RSS链接中CHANNELITEM的各条信息。代码如下:
    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链接信息的基本方法,那就足够了!

刊登于 电脑报2005年3月14日 第10期