昨天弄了一天,終於成功解析了南方週末的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;
}
}
}