⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rssdatasource.cs

📁 vs2005 c# 下的一个rss源解析类,采用解析较快的xmlreader,你完全可以用此类完成你自己的rss订阅器,只需要的是介面的开发了
💻 CS
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Threading;

namespace PtymRss
{
    public class RssDataSource
    {
        private string url;
        private bool isload=false;
        private bool loadcancel;
        public Rss_Rss Rss=new Rss_Rss();
        //防止有的rss不规范,channel的开始深度不对
        private int channelbegindepth=1;

        private XmlDocument rssdocument=new XmlDocument();

        public XmlDocument RssDocument
        {
            get { return rssdocument; }
            set { rssdocument = value; }
        }



        public RssDataSource()
        {
        }
        public RssDataSource(string _url)
        {
            url = _url;
        }

        /// <summary>
        /// 读取xml物理地址
        /// </summary>
        /// <param name="filepath"></param>
        //public RssDataSource(string filepath)
        //{
        //}

        /// <summary>
        /// 读取xml文档;
        /// </summary>
        /// <param name="xmldocument"></param>
        public RssDataSource(XmlDocument xmldocument)
        {
        }

        public bool Isload
        {
            get
            {
                return isload;
            }
        }

        public bool Loadcancel
        {
            get
            {
                return loadcancel;
            }
            set
            {
                loadcancel = value;
            }
        }

        public string Url
        {
            get
            {
                return url;
            }
            set
            {
                url = value;
            }
        }

        public void Load()
        {
            //object x = new object();
            lock ((object)isload)
            {
                isload = true;
                try
                {
                    Thread Td = new Thread(new ThreadStart(LoadRssSource));
                    Td.Start();
                }
                catch
                {
                    isload = false;
                }
               // //LoadRssSource();
            }

        }

        private void LoadRssSource()
        {
            XmlTextReader reader=new XmlTextReader(url);
            while (reader.Read())
            {
                if (reader.NodeType != XmlNodeType.Element) continue;

                if (reader.Name.ToLower() == "channel")
                {
                    PtymRss.Rss_Channel channel = new Rss_Channel();
                    channelbegindepth = reader.Depth;
                    while(reader.Read())
                    {
                        //System.Windows.Forms.MessageBox.Show(reader.Depth.ToString());
                        if (reader.NodeType == XmlNodeType.EndElement && reader.Name.ToLower() == "channel") { Rss.ChannelCollection.Add(channel); break; }
                        if (reader.NodeType != XmlNodeType.Element) continue;

                        string readername=reader.Name.ToLower();
                        reader.Read();

                        switch (readername)
                        {
                            //case "title":
                            //    {
                            //        if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Title = reader.Value; break;
                            //    }
                            //case "link": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Link = reader.Value; break; }
                            //case "description": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Description = reader.Value; break; }
                            //case "language": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Language = reader.Value; break; }
                            //case "pubdate": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.PubDate = reader.Value; break; }
                            //case "lastbuilddate": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.LastBuildDate = reader.Value; break; }
                            //case "docs": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Docs = reader.Value; break; }
                            //case "generator": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.Generator = reader.Value; break; }
                            //case "managingeditor": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.ManagingEditor = reader.Value; break; }
                            //case "webmaster": { if (reader.Depth != 3) { break; } if (reader.NodeType == XmlNodeType.Text || reader.NodeType == XmlNodeType.CDATA) channel.WebMaster = reader.Value; break; }
                            case "title":
                                {
                                    if (reader.Depth != channelbegindepth + 2) { break; } channel.Title = loadnodetext("title", reader, channelbegindepth +2); break;
                                }
                            case "link": { if (reader.Depth != channelbegindepth + 2) { break; } channel.Link = loadnodetext("link", reader, channelbegindepth +2); break; }
                            case "description": { if (reader.Depth != channelbegindepth + 2) { break; } channel.Description = loadnodetext("description", reader, channelbegindepth +2); break; }
                            case "language": { if (reader.Depth != channelbegindepth + 2) { break; } channel.Language = loadnodetext("language", reader, channelbegindepth +2); break; }
                            case "pubdate": { if (reader.Depth != channelbegindepth + 2) { break; } channel.PubDate = loadnodetext("pubdate", reader, channelbegindepth +2); break; }
                            case "lastbuilddate": { if (reader.Depth != channelbegindepth + 2) { break; } channel.LastBuildDate = loadnodetext("lastbuilddate", reader, channelbegindepth +2); break; }
                            case "docs": { if (reader.Depth != channelbegindepth + 2) { break; } channel.Docs = loadnodetext("docs", reader, channelbegindepth +2); break; }
                            case "generator": { if (reader.Depth != channelbegindepth +2) { break; } channel.Generator = loadnodetext("generator", reader, channelbegindepth +2); break; }
                            case "managingeditor": { if (reader.Depth != channelbegindepth +2) { break; } channel.ManagingEditor = loadnodetext("managingeditor", reader, channelbegindepth +2); break; }
                            case "webmaster": { if (reader.Depth != channelbegindepth +2) { break; } channel.WebMaster = loadnodetext("webmaster", reader, channelbegindepth +2); break; }

                            case "item":
                                {
                                    Rss_Item rssitem=new Rss_Item();
                                    while (reader.Read())
                                    {
                                        if (reader.NodeType == XmlNodeType.EndElement && reader.Name.ToLower() == "item") { channel.ItemCollection.Add(rssitem); break; }
                                        if (reader.NodeType != XmlNodeType.Element) { continue; }
                                        string readername2 = reader.Name.ToLower();
                                        reader.Read();
                                        switch (readername2)
                                        {
                                            case "title": { if (reader.Depth != channelbegindepth + 3) { break; } rssitem.Title = loadnodetext("title", reader, channelbegindepth + 3); break; }
                                            case "link": { if (reader.Depth != channelbegindepth + 3) { break; } rssitem.Link = loadnodetext("link", reader, channelbegindepth + 3); break; }
                                            case "description": { if (reader.Depth != channelbegindepth + 3) { break; } rssitem.Description = loadnodetext("description", reader, channelbegindepth + 3); break; }
                                            case "pubdate": { if (reader.Depth != channelbegindepth + 3) { break; } rssitem.Pubdate = loadnodetext("pubdate", reader, channelbegindepth + 3); break; }
                                            case "guid": { if (reader.Depth != channelbegindepth + 3) { break; } rssitem.Guid = loadnodetext("guid", reader, channelbegindepth + 3); break; }
                                            default: break;
                                        }

                                    }
                                    break;
                                }

                            default:
                                break;
                        }

                     }
                }
                    

            }

            isload = false;
        }

        private string loadnodetext(string nodename,XmlReader reader,int depth)
        {
            string returnvalue = "";
            if (reader.NodeType == XmlNodeType.CDATA || reader.NodeType == XmlNodeType.Text)
            {
                returnvalue = reader.Value;
            }
            while (reader.Read())
            {
                //如果已经为结束结点,就退出
                if (reader.NodeType==XmlNodeType.EndElement && reader.Name.ToLower()==nodename)
                {
                    return returnvalue;
                }

                //防止还有下一层要读取
                if (reader.Depth != depth) continue;
                //赋值
                if (reader.NodeType==XmlNodeType.CDATA || reader.NodeType==XmlNodeType.Text)
                {
                    returnvalue= reader.Value;
                }
            }
            return returnvalue;
        }




    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -