c#解析RSS新闻源


昨天弄了一天,终于成功解析了南方周末的RSS新闻源,因为我做的是例子程序,所以是在控制台下写的,但基本思路应该是差不多的~~

RSS类的设计如下

class rss { public struct Channel { public string Title; public Hashtable Items; } public struct Item { public string Title; public string Description; public string Link; public string author; public string pubdate; } } channel下面包含Title和Item两个变量,TItle存的是该RSS源的名称,Item存放的是该RSS源中的新闻列表,Item里面的每一个变量都是Struct Item类型的。

首先是加载XML文档,.NET提供了很多种加载XML的方法,具体的可以参考微软的帮助手册

本文采用XmlDoucment.Load方法,下面是具体的代码


XmlTextReader Reader = new XmlTextReader("http://www.infzm.com/rss/home/rss2.0.xml"); XmlDocument xmlDoc= new XmlDocument(); xmlDoc.Load(Reader);

先写了一个FoundChildNode(XmlNode Node, string Name)函数去查找指定Node结点下名称为Name的子节点

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"); rss.Channel channel = new rss.Channel(); channel.Items = new Hashtable(); for (int i = 0; i < channelNode.ChildNodes.Count;i++ ) { 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; } } getRssItem函数是遍历所有Item结点的子节点,然后将相应的内容存入Item中,也就是将我们需要的新闻标题,时间,描述等等存入Item中。 private rss.Item getRssItem(XmlNode Node) { rss.Item item = new rss.Item(); for (int i = 0; i < Node.ChildNodes.Count; i++) { if (Node.ChildNodes[i].Name == "title") { item.Title = Node.ChildNodes[i].InnerText; } else if (Node.ChildNodes[i].Name == "description") { item.Description = Node.ChildNodes[i].InnerText; } else if (Node.ChildNodes[i].Name == "link") { item.Link = Node.ChildNodes[i].InnerText; } else if(Node.ChildNodes[i].Name == "author") {
                    item.author = Node.ChildNodes[i].InnerText;
}
else if(Node.ChildNodes[i].Name == "pubdate")
{
item.pubdate = Node.ChildNodes[i].InnerText; }
} return item; }
最后在控制台下输出RSS内容 static void Main(String[] args) { Program program = new Program(); rss.Channel readChannel = new rss.Channel(); readChannel=program.ReadXml(); Console.WriteLine(readChannel.Title); for (int i = 0; i < readChannel.Items.Count; i++) { rss.Item item = (rss.Item)readChannel.Items[i]; Console.WriteLine(item.Title); Console.WriteLine(item.Link); Console.WriteLine(item.Description); Console.WriteLine(item.author); Console.WriteLine(item.pubdate); } }
Console.WriteLine(item.Link);

以上大部分思路都是来自于http://tianxie3633.blog.163.com/blog/static/660254002009112084946324/


本文是在控制台下写的,请不要随便复制粘贴,请在理解的基础上灵活运用,我贴出整个代码给初学者参考

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Collections; namespace RssClass { class Program { 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; } private rss.Item getRssItem(XmlNode Node) { rss.Item item = new rss.Item(); for (int i = 0; i < Node.ChildNodes.Count; i++) { if (Node.ChildNodes[i].Name == "title") { item.Title = Node.ChildNodes[i].InnerText; } else if (Node.ChildNodes[i].Name == "description") { item.Description = Node.ChildNodes[i].InnerText; } else if (Node.ChildNodes[i].Name == "link") { item.Link = Node.ChildNodes[i].InnerText; } } return item; } public rss.Channel ReadXml() { XmlTextReader Reader = new XmlTextReader("http://www.infzm.com/rss/home/rss2.0.xml"); // XmlValidatingReader Valid = new XmlValidatingReader(Reader); // Valid.ValidationType = ValidationType.None; XmlDocument xmlDoc= new XmlDocument(); xmlDoc.Load(Reader); XmlNode rssNode = FoundChildNode(xmlDoc, "rss"); XmlNode channelNode = FoundChildNode(rssNode, "channel"); rss.Channel channel = new rss.Channel(); channel.Items = new Hashtable(); for (int i = 0; i < channelNode.ChildNodes.Count;i++ ) { 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; } } } return channel; } static void Main(String[] args) { Program program = new Program(); rss.Channel readChannel = new rss.Channel(); readChannel=program.ReadXml(); Console.WriteLine(readChannel.Title); for (int i = 0; i < readChannel.Items.Count; i++) { rss.Item item = (rss.Item)readChannel.Items[i]; Console.WriteLine(item.Title); Console.WriteLine(item.Link); Console.WriteLine(item.Description); } } } class rss { public struct Channel { public string Title; public Hashtable Items; } public struct Item { public string Title; public string Description; public string Link; } } }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值