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

推荐订阅源

V
Vulnerabilities – Threatpost
U
Unit 42
F
Fortinet All Blogs
aimingoo的专栏
aimingoo的专栏
P
Proofpoint News Feed
F
Full Disclosure
月光博客
月光博客
Engineering at Meta
Engineering at Meta
博客园_首页
The Register - Security
The Register - Security
G
Google Developers Blog
The Cloudflare Blog
博客园 - Franky
K
Kaspersky official blog
A
Arctic Wolf
Scott Helme
Scott Helme
C
Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
C
Check Point Blog
NISL@THU
NISL@THU
AI
AI
D
DataBreaches.Net
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Stack Overflow Blog
Stack Overflow Blog
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
Vercel News
Vercel News
T
Tor Project blog
P
Privacy International News Feed
D
Docker
I
Intezer
L
LangChain Blog
P
Proofpoint News Feed
Security Latest
Security Latest
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threatpost
博客园 - 聂微东
AWS News Blog
AWS News Blog
Martin Fowler
Martin Fowler
P
Privacy & Cybersecurity Law Blog
V
V2EX
Last Week in AI
Last Week in AI
C
Cybersecurity and Infrastructure Security Agency CISA
The Hacker News
The Hacker News
T
Tenable Blog
Blog — PlanetScale
Blog — PlanetScale
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog

博客园 - aimar

常见的 Web 项目转换问题及解决方案(转载) 在VS2005 正确地创建、部署和维护由1.1迁移到ASP.NET 2.0 应用程序 ajax用户控件中读取session的问题 - aimar - 博客园 世界杯分组与赛程 可否在vs2005中开发asp.net1.1的项目? 试用了一下google的个性化主页 Asp.net WebControls基本概念 连接sql2005 SqlServer2000的xml功能 DotNet2.0中上传文件 - aimar - 博客园 Oracle相关资源 关于使用存储过程的一些好处以及注意事项 DataGrid生成序号列 - aimar - 博客园 asp.net常用函数 Asp.Net2.0编译模式 Asp.Net2.0的改变 ASP.NET 2.0 Beta2中页面编译模型的变化 数据库访问程序块的效率问题 Rss应用(一) 创建rss
Rss应用(二) 抽取Rss
aimar · 2006-01-05 · via 博客园 - aimar

Rss的格式是符合Rss的标准的,要抽取Rss信息,首先要了解Rss标准的格式

Rss的基本格式

我们打开一个Rss的链接 http://zqs.cnblogs.com/Rss.aspx ,可以发现Rss是遵守以下格式的


在图中RSS节点表示当前是一个RSS文件,它由一个CHANNEL节点及其子节点组成,其中一些子节点提供关于频道本身的信息,比如title表示频道的名称(“百度互联网新闻”)。

    CHANNEL节点又包含多个ITEM子节点,而ITEM节点就是程序需要处理的部分,因为它对应着每条实际的新闻项信息, 每个ITEM节点又通过其子节点提供关于这条新闻的详细信息,比如title表示新闻的标题(“微软IM称王”),link对应新闻实际的链接。

我们只需提取并显示出CHANNELITEM下的各条信息就可以了。

抽取方法

根据上面分析的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节点。这里我只读取了有限的几个节点,读者可以根据实际需要扩展整个结构定义。

 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属性。


 将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);}