C#中解析Rss实现思路及通用类--源代码

本文介绍了一种RSS解析方法,通过自定义的C#类库实现RSS订阅源的读取与解析。该方法包括Feed、Channel及Item等核心组件,并支持不同编码格式的内容处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Rss是 Web 2.0 时代的主要特征,那么有没有一种通用的方法来解析Rss呢?

当然有了,呵呵。下面给出了一种思路,仅供参考!

主要用到了几个类文件:

Channel.cs 、ChannelCollection.cs 、 Feed.cs 、 Item.cs  、 ItemCollection.cs

下面给出各个类的源文件:

1、Channel.cs 类

 

using System;

namespace Utility.Rss
...{
    
/**//// <summary>
    
/// channel 
    
/// </summary>

    [Serializable()]
    
public class Channel
    
...{
        
private string _title;
        
private string _link;
        
private string _description;
        
private ItemCollection items = new ItemCollection();

        
属性#region 属性
        
/**//// <summary>
        
/// 标题
        
/// </summary>

        public string title
        
...{
            
get...{return _title;}
            
set...{_title = value.ToString();}
        }

        
/**//// <summary>
        
/// 链接
        
/// </summary>

        public string link
        
...{
            
get...{return _link;}
            
set...{_link = value.ToString();}
        }

        
/**//// <summary>
        
/// 描述
        
/// </summary>

        public string description
        
...{
            
get...{return _description;}
            
set...{_description = value.ToString();}
        }

        
public ItemCollection Items
        
...{
            
get ...return items; }
        }

        
#endregion


        
public Channel()...{}


    }
//
}
//

 

2、ChannelCollection.cs 类

 

using System;

namespace Utility.Rss
...{
    
/**//// <summary>
    
/// rssChannelCollection 的摘要说明。
    
/// </summary>

    public class ChannelCollection : System.Collections.CollectionBase
    
...{
        
public Channel this[int index]
        
...{
            
get 
            
...
                
return ((Channel)(List[index])); 
            }

            
set 
            
...
                List[index] 
= value;
            }

        }


        
public int Add(Channel item)
        
...{
            
return List.Add(item);
        }



        
public ChannelCollection()
        
...{            
        }



    }
//
}
//

 

3、Feed.cs类

 

using System;
using System.Xml;
using System.IO;
using System.Net;
using System.Text;

namespace Utility.Rss
...{
    
/**//// <summary>
    
/// rssFeed 的摘要说明。
    
/// </summary>

    public class Feed
    
...{
        
private string _url;
        
private System.DateTime _lastModified;
        
private System.DateTime _lastRssDate;
        
private Channel channel = new Channel();

        
公共属性#region 公共属性
        
public string url
        
...{
            
get...{return _url;}
            
set...{_url=value;}
        }

        
public System.DateTime lastModified
        
...{
            
get...{return _lastModified;}
        }

        
public System.DateTime lstRssDate
        
...{
            
set...{_lastRssDate=value;}
        }

        
public Channel Channel
        
...{
            
get ...return channel; }
        }
        
        
#endregion



        
public Feed()
        
...{
        }


        
public Feed(string url,System.DateTime dt)
        
...{
            
this._url=url;
            
this._lastRssDate=dt;
        }


        
public void Read()
        
...{
            XmlDocument xDoc
=new XmlDocument();
            HttpWebRequest request 
= (HttpWebRequest)WebRequest.Create(_url);
            request.Timeout
=15000;
            request.UserAgent
=@"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.40607; .NET CLR 1.1.4322)";
            Stream stream;
            HttpWebResponse response 
= (HttpWebResponse)request.GetResponse();
            
this._lastModified = response.LastModified;
            stream 
= response.GetResponseStream();
            StreamReader sr;
                
//System.Xml.XmlReader = new XmlReader();
                
//stream=Encoding.Convert(Encoding.GetEncoding("GBK"),Encoding.GetEncoding("gb2312"),Convert.ToSByte(stream));
            if(this.Get_CH(response.Headers["Content-Type"].ToString())=="GBK")
            
...{
                sr
= new StreamReader(stream,System.Text.Encoding.GetEncoding("GB2312"));
                xDoc.Load(sr);
            }

            
else
            
...{
//                sr= new StreamReader(stream,System.Text.Encoding.UTF8);
                xDoc.Load(stream);
            }


            
if(this._lastRssDate<this._lastModified)
            
...{
                XmlNodeList xnList
=xDoc.DocumentElement["channel"].SelectNodes("item");
                
//                XmlNodeList xnList=xDoc.SelectNodes("items");
                int a= xnList.Count;
                
foreach(XmlNode xNode in xnList)
                
...{                
                    Item rt
=new Item();
                    rt.title
=xNode.SelectSingleNode("title").InnerText.Replace("'","''");
                    rt.link
=xNode.SelectSingleNode("link").InnerText.Replace("'","''");
                    rt.description
=xNode.SelectSingleNode("description").InnerText.Replace("'","''");
                    
try
                    
...{
                        rt.pubDate
=xNode.SelectSingleNode("pubDate").InnerText;
                    }

                    
catch
                    
...{
                        rt.pubDate
=this._lastModified.ToString();
                    }

                    channel.Items.Add(rt);
                }

            }

        }




        
public string Create()
        
...{
            
return "";
        }


        
private string Get_CH(string s)
        
...{
            
int l=s.IndexOf("charset=")+8;
            
return s.Substring(l,s.Length-l);
        }


    }
//
}
//

 

 

4、Item.cs类

 

 

using System;

namespace Utility.Rss
...{
    
/**//// <summary>
    
/// rssItem 的摘要说明。
    
/// </summary>

    public class Item
    
...{
        
private string _title;
        
private string _link;
        
private string _description;
        
private string _pubDate;

        
属性#region 属性

        
/**//// <summary>
        
/// 标题
        
/// </summary>

        public string title
        
...{
            
get...{return _title;}
            
set...{_title=value.ToString();}
        }

        
/**//// <summary>
        
/// 链接
        
/// </summary>

        public string link
        
...{
            
get...{return _link;}
            
set...{_link=value.ToString();}
        }

        
/**//// <summary>
        
/// 描述
        
/// </summary>

        public string description
        
...{
            
get...{return _description;}
            
set...{_description=value.ToString();}
        }

        
/**//// <summary>
        
/// 频道内容发布日期
        
/// </summary>

        public string pubDate
        
...{
            
get...{return _pubDate;}
            
set...{_pubDate=C_Date(value);}
        }


        
#endregion


        
public Item()...{}

        
private string C_Date(string input)
        
...{
            System.DateTime dt;
            
try
            
...{
                dt
=Convert.ToDateTime(input);
            }

            
catch
            
...{
                dt
=System.DateTime.Now;
            }

            
return dt.ToString();
        }


    }
//
}
//

 

5、ItemCollection.cs类

 

using System;

namespace Utility.Rss
...{
    
/**//// <summary>
    
/// rssChannelCollection 的摘要说明。
    
/// </summary>
    public class ItemCollection : System.Collections.CollectionBase
    
...{
        
public Item this[int index]
        
...{
            
get ...return ((Item)(List[index])); }
            
set 
            
...
                List[index] 
= value;
            }

        }

        
public int Add(Item item)
        
...{
            
return List.Add(item);
        }


        
public ItemCollection()
        
...{            
        }


    }
//
}
//

 

转载于:https://www.cnblogs.com/togezor/archive/2008/07/26/1252224.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值