用C#制作新闻阅读器(电脑报2005年3月14日 第10期)
一。弄清结构再动手
要想轻松的抽取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链接信息的基本方法,那就足够了!
刊登于 电脑报2005年3月14日 第10期
转载于:https://www.cnblogs.com/owendu/archive/2006/10/20/534838.html
用C#制作新闻阅读器(电脑报2005年3月14日 第10期)相关推荐
- 献给开发者的大礼--打造CSDN论坛专用阅读器(电脑报2006年11月6日 第44期)
CSDN.NET是中国著名的IT技术社区,为IT专业技术人员提供最全面的信息传播和服务平台.每天,大量的开发者都会到论坛上看帖和回帖,但是在使用过程中,我感觉有些不方便,主要表现在以下几点: 帖子数量 ...
- jQuery Mobile发展新闻阅读器,适应iphone和android打电话
程序猿是很不赖,你知道. 我们经常新浪,腾讯.雅虎等各大网站看到上述新闻.他们还推出了自己的移动新闻阅读器.今天,我自己用的jQuery Mobile 为了实现这一功能,.图像大小上传限制的大小250 ...
- jQuery Mobile开发的新闻阅读器,适应iphone和android手机
程序猿都非常赖.你懂的! 我们常常上新浪,腾讯.雅虎等各大站点上面看新闻.他们也都各自推出了自家的手机新闻阅读器.今天我自己使用jQuery Mobile 来实现这一功能.图片大小上传限制了大小250 ...
- QT实现RSS新闻阅读器
QT实现RSS新闻阅读器 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 一个QML RSS新闻阅读器,它使用XmlListModel和XmlRole下载XML数据, ...
- Android 仿 新闻阅读器 菜单弹出效果(附源码DEMO)
这一系列博文都是:(android高仿系列)今日头条 --新闻阅读器 (一) 开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO. 原本觉 ...
- pdf阅读器(福昕pdf阅读器电脑版)免安装pjb
一提到福昕阅读器电脑版,大家应该都很熟悉吧,这是一款非常优秀的PDF阅读软件,拥有强大的编辑功能和文件保护能力,涵盖文档创建.转换.打印.编辑.注释.表单处理.签名.保护.协同合作.可访问性等文档生命 ...
- android实现阅读器底部菜单,android仿新闻阅读器菜单弹出效果实例(附源码DEMO下载)...
开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO. 原本觉得是最后完成后发网站客户端的,可是这样体现不出一个功能一个功能的分析实现效果, ...
- (android高仿系列)今日头条 --新闻阅读器 (一)
在模仿中循序渐进,以程序员角度去看待每一个APP是如何实现的,它有什么优缺点,并从中提升自己. 之前发现很多人在群里面.论坛上求网易新闻客户端的源码,之后我就去下了个网易新闻客户端和今日头条新闻客户端 ...
- 今日头条 --新闻阅读器
高仿今日头条 --- 第一篇:(android高仿系列)今日头条 --新闻阅读器 (一) 上次,已经完成了头部新闻分类栏目的拖动效果. 这篇文章是继续去完善APP 今日头条 这个新闻阅读器的其他功能 ...
最新文章
- Linux系统搭建FTP服务器
- 使用HTML+CSS实现鼠标划过的二级菜单栏
- 自动检测CSRF漏洞的工具
- 理解Prefix.pch文件
- springBoot+mybatisPlus小demo
- charCodeAt()和charAt()的用法
- POJ 1149(最大流)
- 中国人去日本买电饭煲令人痛心!董明珠:难道我泱泱大国造不出吗?
- java控制硬件_厨师都开始用Python和Java了,现在C语言还值得我们学习吗?
- 使用mathematica求解最优化模型
- BME280嵌入式设计-基于STM32F103的温湿度气压控制板-支持蓝牙串口输出数据!!!
- ews java api maven_通过 EWS JAVA API读取exchange邮件
- python easydict 简单使用
- webgl中解决深度冲突-多边形偏移
- 冬季盲目补农夫山蒸营养易引发青春痘
- C语言中fscanf和fprintf函数的使用
- 今晚,为梅西和莫德里奇熬夜!这个CV模型,让你猜球必赢
- elasticsearch基础1——索引、文档
- ros理论与实践网盘资源
- Husky 的报错及简易配置
热门文章
- AI 岗位年薪下降 8.9%,程序员越“老”越吃香,最新薪酬报告发布!
- 夏天写代码真难!16G 内存根本不够用! | 每日趣闻
- 做了7年软件工程师,从500多场技术面试中学到了什么?
- 如何打造一支拖业务后腿的技术团队?
- 支持大数据渲染下拉列表组件开发 SuperSelect(基于antd Select)
- 第二十四章:页面导航(六)
- java.io与网络通信
- DotNetTextBoxV3.0在线编辑器控件Ver3.4.2 Open Source开源版
- 基于Proxy的小程序状态管理
- Form 去掉使用格式掩码带来的多余字符