Rss的格式是符合Rss的标准的,要抽取Rss信息,首先要了解Rss标准的格式
Rss的基本格式
我们打开一个Rss的链接 http://zqs.cnblogs.com/Rss.aspx ,可以发现Rss是遵守以下格式的
在图中RSS节点表示当前是一个RSS文件,它由一个CHANNEL节点及其子节点组成,其中一些子节点提供关于频道本身的信息,比如title表示频道的名称(“百度互联网新闻”)。
CHANNEL节点又包含多个ITEM子节点,而ITEM节点就是程序需要处理的部分,因为它对应着每条实际的新闻项信息, 每个ITEM节点又通过其子节点提供关于这条新闻的详细信息,比如title表示新闻的标题(“微软IM称王”),link对应新闻实际的链接。
我们只需提取并显示出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节点。这里我只读取了有限的几个节点,读者可以根据实际需要扩展整个结构定义。
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);}