您的位置:首页 > 其它

【原创】RSS开发心得小结

2010-10-14 23:45 176 查看
几经面试和简历更新,发现自己做了这么久的开发,却少于做总结,一个个项目过去了,但是知识的累积沉淀却很少……

借着这次机会,把以前的skill整理一下,浓缩的才是精华。为自己也为其他初学的朋友做个参考。

RSS(全称Really Simple Syndication) 目前广泛用于网上新闻频道,blog和wiki,主要的版本有0.91, 1.0, 2.0。

另外还有Google制定的ATOM格式,以及作为Feed集合的OPML文件。

最常见的Feed格式是Rss1.0,2.0和ATOM,解析时通过不同的命名空间来处理不同的版本,下面是解析的主要代码:

FeedItem解析

/// <summary>
/// 获取item列表
/// </summary>
/// <param name="xnlItems"></param>
public static List<FeedItem> GetItems(XmlNodeList xnlItems, FeedType type, XmlNamespaceManager mgr)
{
List<FeedItem> lstItems = new List<FeedItem>();
if (xnlItems != null)
{
switch (type)
{
case FeedType.RSS_1_0:
foreach (XmlNode xne in xnlItems)
{
FeedItem fim = new FeedItem();
fim.Title = xne.SelectSingleNode("rdf:title", mgr) != null ? xne.SelectSingleNode("rdf:title", mgr).InnerText : string.Empty;
fim.Link = xne.SelectSingleNode("rdf:link", mgr) != null ? xne.SelectSingleNode("rdf:link", mgr).InnerText : string.Empty;
//rim.Description = xne.SelectSingleNode("rdf:description", mgr) != null ? xne.SelectSingleNode("rdf:description", mgr).InnerText : string.Empty;
string strContent = xne.SelectSingleNode("content:encoded", mgr) != null ? xne.SelectSingleNode("content:encoded", mgr).InnerText : string.Empty;
string strDescription = xne.SelectSingleNode("rdf:description", mgr) != null ? xne.SelectSingleNode("rdf:description", mgr).InnerText : string.Empty;
fim.Description = strContent == string.Empty ? strDescription : strContent;
fim.Description = fim.Description.Replace("<![CDATA[", string.Empty).Replace("]]>", string.Empty);
string strAuthorName = xne.SelectSingleNode("//rdf:author", mgr) != null ? xne.SelectSingleNode("//rdf:author", mgr).InnerText : string.Empty;
if (strAuthorName != string.Empty)
{
strAuthorName = xne.SelectSingleNode("dc:creator", mgr) != null ? xne.SelectSingleNode("dc:creator", mgr).InnerText : string.Empty;
}
if (strAuthorName != string.Empty)
{
fim.Author = new FeedPerson();
fim.Author.Name = strAuthorName;
}
fim.PubDate = xne.SelectSingleNode("rdf:pubDate", mgr) != null ? GetDateTimeByUrl(fim.Link,xne.SelectSingleNode("rdf:pubDate", mgr).InnerText) : DateTime.MinValue;
if (fim.PubDate == DateTime.MinValue)
{
fim.PubDate = xne.SelectSingleNode("dc:date", mgr) != null ? GetDateTimeByUrl(fim.Link, xne.SelectSingleNode("dc:date", mgr).InnerText) : DateTime.MinValue;
}
XmlNodeList xnlSubjects = xne.SelectNodes("dc:subject", mgr);
if (xnlSubjects != null)
{
foreach (XmlNode xnlSubject in xnlSubjects)
{
fim.Subject += xnlSubject.InnerText + ",";
}
}
XmlNode xndEnclosure = xne.SelectSingleNode("enclosure", mgr);
if (xndEnclosure != null)
{
fim.Enclosures = new List<FeedEnclosure>();
FeedEnclosure enc = new FeedEnclosure();
enc.Type = xndEnclosure.Attributes["type"] != null ? xndEnclosure.Attributes["type"].Value : string.Empty;
string strLength = xndEnclosure.Attributes["length"] != null ? xndEnclosure.Attributes["length"].Value : string.Empty;
try
{
enc.Length = Convert.ToInt32(strLength);
}
catch { }
enc.Url = xndEnclosure.Attributes["url"] != null ? xndEnclosure.Attributes["url"].Value : string.Empty;
fim.Enclosures.Add(enc);
}
fim.Description += GetHtmlByByEnclosure(fim.Enclosures);
fim.TrackbackPing = xne.SelectSingleNode("trackback:ping", mgr) != null ? xne.SelectSingleNode("trackback:ping", mgr).InnerText : string.Empty;
lstItems.Add(fim);
}
break;
case FeedType.RSS_2_0:
foreach (XmlNode xne in xnlItems)
{
FeedItem fim = new FeedItem();
fim.Title = xne.SelectSingleNode("title", mgr) != null ? xne.SelectSingleNode("title", mgr).InnerText : string.Empty;
fim.Link = xne.SelectSingleNode("link", mgr) != null ? xne.SelectSingleNode("link", mgr).InnerText : string.Empty;
string strContent = xne.SelectSingleNode("content:encoded", mgr) != null ? xne.SelectSingleNode("content:encoded", mgr).InnerText : string.Empty;
string strDescription = xne.SelectSingleNode("description", mgr) != null ? xne.SelectSingleNode("description", mgr).InnerText : string.Empty;
fim.Description = strContent == string.Empty ? strDescription : strContent;
fim.Description = fim.Description.Replace("<![CDATA[", string.Empty).Replace("]]>", string.Empty);
string strAuthorName = xne.SelectSingleNode("author", mgr) != null ? xne.SelectSingleNode("author", mgr).InnerText : string.Empty;
if (strAuthorName != string.Empty)
{
strAuthorName = xne.SelectSingleNode("dc:creator", mgr) != null ? xne.SelectSingleNode("dc:creator", mgr).InnerText : string.Empty;
}
if (strAuthorName != string.Empty)
{
fim.Author = new FeedPerson();
fim.Author.Name = strAuthorName;
}
fim.PubDate = xne.SelectSingleNode("pubDate", mgr) != null ? GetDateTimeByUrl(fim.Link,xne.SelectSingleNode("pubDate", mgr).InnerText) : DateTime.MinValue;
if (fim.PubDate == DateTime.MinValue)
{
fim.PubDate = xne.SelectSingleNode("dc:date", mgr) != null ? GetDateTimeByUrl(fim.Link,xne.SelectSingleNode("dc:date", mgr).InnerText) : DateTime.MinValue;
}
fim.Guid = xne.SelectSingleNode("guid", mgr) != null ? xne.SelectSingleNode("guid", mgr).InnerText : string.Empty;
XmlNodeList xnlSubjects = xne.SelectNodes("dc:subject", mgr);
if (xnlSubjects != null)
{
foreach (XmlNode xnlSubject in xnlSubjects)
{
fim.Subject += xnlSubject.InnerText + ",";
}
}
XmlNodeList xnlCategorys = xne.SelectNodes("category", mgr);
if (xnlCategorys != null)
{
foreach (XmlNode xnlCategory in xnlCategorys)
{
fim.Category += xnlCategory != null ? xnlCategory.InnerText : string.Empty;
fim.Category += ",";
}
}
XmlNode xndEnclosure = xne.SelectSingleNode("enclosure", mgr);
if (xndEnclosure != null)
{
fim.Enclosures = new List<FeedEnclosure>();
FeedEnclosure enc = new FeedEnclosure();
enc.Type = xndEnclosure.Attributes["type"] != null ? xndEnclosure.Attributes["type"].Value : string.Empty;
string strLength = xndEnclosure.Attributes["length"] != null ? xndEnclosure.Attributes["length"].Value : string.Empty;
try
{
enc.Length = Convert.ToInt32(strLength);
}
catch { }
enc.Url = xndEnclosure.Attributes["url"] != null ? xndEnclosure.Attributes["url"].Value : string.Empty;
fim.Enclosures.Add(enc);
}
fim.Description += GetHtmlByByEnclosure(fim.Enclosures);
fim.TrackbackPing = xne.SelectSingleNode("trackback:ping", mgr) != null ? xne.SelectSingleNode("trackback:ping", mgr).InnerText : string.Empty;
lstItems.Add(fim);
}
break;
case FeedType.ATOM_0_3:

foreach (XmlNode xne in xnlItems)
{
FeedItem fim = new FeedItem();
fim.Title = xne.SelectSingleNode("atom:title", mgr) != null ? xne.SelectSingleNode("atom:title", mgr).InnerText : string.Empty;
fim.Link = xne.SelectSingleNode("atom:link[@rel='alternate']", mgr) != null ? xne.SelectSingleNode("atom:link[@rel='alternate']", mgr).Attributes["href"].InnerText : string.Empty;
fim.Summary = xne.SelectSingleNode("atom:summary", mgr) != null ? xne.SelectSingleNode("atom:summary", mgr).InnerText : string.Empty;
fim.Description = xne.SelectSingleNode("atom:content", mgr) != null ? xne.SelectSingleNode("atom:content", mgr).InnerText : string.Empty;
fim.Description = fim.Description.Replace("<![CDATA[", string.Empty).Replace("]]>", string.Empty);

fim.Guid = xne.SelectSingleNode("atom:id", mgr) != null ? xne.SelectSingleNode("atom:id", mgr).InnerText : string.Empty;
fim.Contributor = xne.SelectSingleNode("atom:contributor", mgr) != null ? xne.SelectSingleNode("atom:contributor", mgr).InnerText : string.Empty;
XmlNode xneAuthor = xne.SelectSingleNode("atom:author", mgr);
if (xneAuthor != null)
{
fim.Author = new FeedPerson();
fim.Author.Name = xneAuthor.SelectSingleNode("atom:name", mgr) != null ? xneAuthor.SelectSingleNode("atom:name", mgr).InnerText : string.Empty;
fim.Author.Url = xneAuthor.SelectSingleNode("atom:uri", mgr) != null ? xneAuthor.SelectSingleNode("atom:uri", mgr).InnerText : string.Empty;
fim.Author.Email = xneAuthor.SelectSingleNode("atom:email", mgr) != null ? xneAuthor.SelectSingleNode("atom:email", mgr).InnerText : string.Empty;
}
fim.UpdateDate = xne.SelectSingleNode("atom:updated", mgr) != null ? GetDateTimeByUrl(fim.Link, xne.SelectSingleNode("atom:updated", mgr).InnerText) : DateTime.MinValue;
if (fim.UpdateDate == DateTime.MinValue)
{
fim.UpdateDate = xne.SelectSingleNode("atom:modified", mgr) != null ? GetDateTimeByUrl(fim.Link, xne.SelectSingleNode("atom:modified", mgr).InnerText) : DateTime.MinValue;
}
fim.PubDate = xne.SelectSingleNode("atom:published", mgr) != null ? GetDateTimeByUrl(fim.Link, xne.SelectSingleNode("atom:published", mgr).InnerText) : DateTime.MinValue;
if (fim.PubDate == DateTime.MinValue)
{
fim.PubDate = xne.SelectSingleNode("atom:issued", mgr) != null ? GetDateTimeByUrl(fim.Link, xne.SelectSingleNode("atom:issued", mgr).InnerText) : DateTime.MinValue;
}
if (fim.PubDate == DateTime.MinValue)
{
fim.PubDate = xne.SelectSingleNode("atom:created", mgr) != null ? GetDateTimeByUrl(fim.Link, xne.SelectSingleNode("atom:created", mgr).InnerText) : DateTime.MinValue;
}
XmlNodeList xnlTags = xne.SelectNodes("dc:subject", mgr);
XmlNodeList xnlSubjects = xne.SelectNodes("dc:subject", mgr);
if (xnlSubjects != null)
{
foreach (XmlNode xnlSubject in xnlSubjects)
{
fim.Subject += xnlSubject.InnerText + ",";
}
}
XmlNodeList xnlCategorys = xne.SelectNodes("atom:category", mgr);
if (xnlCategorys != null)
{
foreach (XmlNode xnlCategory in xnlCategorys)
{
fim.Category += xnlCategory.Attributes["term"] != null ? xnlCategory.Attributes["term"].Value : string.Empty;
fim.Category += ",";
}
}
XmlNodeList xnlEnclosures = xne.SelectNodes("atom:link[@rel='enclosure']", mgr);
if (xnlEnclosures != null)
{
fim.Enclosures = new List<FeedEnclosure>();
foreach (XmlNode xndEnclosure in xnlEnclosures)
{
FeedEnclosure enc = new FeedEnclosure();
enc.Type = xndEnclosure.Attributes["type"] != null ? xndEnclosure.Attributes["type"].Value : string.Empty;
string strLength = xndEnclosure.Attributes["length"] != null ? xndEnclosure.Attributes["length"].Value : string.Empty;
try
{
enc.Length = Convert.ToInt32(strLength);
}
catch { }
enc.Url = xndEnclosure.Attributes["href"] != null ? xndEnclosure.Attributes["href"].Value : string.Empty;
enc.Title = xndEnclosure.Attributes["title"] != null ? xndEnclosure.Attributes["title"].Value : string.Empty;
fim.Enclosures.Add(enc);
}
}
fim.Description += GetHtmlByByEnclosure(fim.Enclosures);
fim.TrackbackPing = xne.SelectSingleNode("trackback:ping", mgr) != null ? xne.SelectSingleNode("trackback:ping", mgr).InnerText : string.Empty;
fim.Rights = xne.SelectSingleNode("atom:rights", mgr) != null ? xne.SelectSingleNode("atom:rights", mgr).InnerText : string.Empty;
lstItems.Add(fim);
}
break;
default:
return null;
}
}
return lstItems;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: