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();
公共属性
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;
属性
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()
{
}
}
//
}
//
本文介绍了一个RSS解析器的实现方案,通过几个关键类的设计来解析RSS源,包括Channel、Item等,支持读取RSS信息并更新到本地。
598

被折叠的 条评论
为什么被折叠?



