C#中解析Rss实现思路及通用类–源代码
2009-07-14 14:03
519 查看
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()
…
{
}
}
//
}
//
当然有了,呵呵。下面给出了一种思路,仅供参考!
主要用到了几个类文件:
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()
…
{
}
}
//
}
//
相关文章推荐
- C#中解析Rss实现思路及通用类--源代码
- 用C#实现RSS的生成和解析,支持RSS2.0和Atom格式
- 用C#实现RSS的生成和解析,支持RSS2.0和Atom格式
- C#实现解析百度天气数据,Rss解析百度新闻以及根据IP获取所在城市的方法
- 广度优先搜索BFS-C实现、思路、解析和总结
- easyui组件解析的实现思路
- 网络编程难点解析(二)—— TCP之心跳包实现思路
- JPEG图片文件格式浅析,以及使用C#实现图片的解析
- C# 项目启动界面 实现思路
- C#实现软件自动更新思路
- .NET通用JSON解析/构建类的实现(c#)
- 用 C# 实现的一个队列源代码
- 多层交换机 实现不同网段 互通 思路解析
- C#实现的列出目录下所有子目录和文件的程序(附思路)
- 解析C#彩色图像灰度化算法的实现代码详解
- 用C#实现软件自动更新思路
- C# 动态获取、修改、更新配置文件 实现思路
- C#实现用Newtonsoft.Json 4.5.11解析人人网院校信息并获取院系信息
- C#发送邮件的实现实例解析
- 鼠标手势(Mouse Gesture)的C#实现源代码