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




發佈了42 篇原創文章 · 獲贊 71 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章