📄 rssreader.cs
字号:
break;
}
case "ttl":
{
rssFeed.Ttl = channelXmlNode.ChildNodes[i].InnerText;
break;
}
case "rating":
{
rssFeed.Rating = channelXmlNode.ChildNodes[i].InnerText;
break;
}
case "skipHours":
{
rssFeed.Skiphours = channelXmlNode.ChildNodes[i].InnerText;
break;
}
case "skipDays":
{
rssFeed.Skipdays = channelXmlNode.ChildNodes[i].InnerText;
break;
}
case "managingEditor":
{
rssFeed.ManagingEditor = channelXmlNode.ChildNodes[i].InnerText;
break;
}
case "item":
{
rssFeed.Items.Add(this.getRssItem(channelXmlNode.ChildNodes[i]));
// Fire found事件
if (this.ItemAdded != null)
{
this.ItemAdded(this, new EventArgs());
}
break;
}
}
}
// 若设置rdf模式,则channel只包含其有关信息,而不含item节点,item节点在RDF文档中属于根节点的孩子
if (this.rdfMode)
{
for (int i = 0; i < rssXmlNode.ChildNodes.Count; i++)
{
switch (rssXmlNode.ChildNodes[i].Name)
{
case "item":
{
rssFeed.Items.Add(this.getRssItem(rssXmlNode.ChildNodes[i]));
// Fire found事件
if (this.ItemAdded != null)
{
this.ItemAdded(this, new EventArgs());
}
break;
}
}
}
}
}
else
{
rssFeed.ErrorMessage = "Unable to find rss <channel> node";
// Fire error事件
if (this.Error != null)
{
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();
args.Message = rssFeed.ErrorMessage;
this.Error(this, args);
}
}
}
else
{
rssFeed.ErrorMessage = "Unable to find root <rss> node";
// Fire error事件
if (this.Error != null)
{
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();
args.Message = rssFeed.ErrorMessage;
this.Error(this, args);
}
}
}
catch (XmlException err) // 捕捉异常
{
rssFeed.ErrorMessage = "Xml error: " + err.Message;
// Fire error事件
if (this.Error != null)
{
RssReaderErrorEventArgs args = new RssReaderErrorEventArgs();
args.Message = rssFeed.ErrorMessage;
this.Error(this, args);
}
return rssFeed;
}
return rssFeed;
}
// 从XML节点通过相应子节点创建RSS item
private RssItem getRssItem(XmlNode xmlNode)
{
RssItem rssItem = new RssItem();
for (int i = 0; i < xmlNode.ChildNodes.Count; i++)
{
switch (xmlNode.ChildNodes[i].Name)
{
case "title":
{
rssItem.Title = xmlNode.ChildNodes[i].InnerText;
break;
}
case "description":
{
rssItem.Description = xmlNode.ChildNodes[i].InnerText;
break;
}
case "link":
{
rssItem.Link = xmlNode.ChildNodes[i].InnerText;
break;
}
case "author":
{
rssItem.Author = xmlNode.ChildNodes[i].InnerText;
break;
}
case "comments":
{
rssItem.Comments = xmlNode.ChildNodes[i].InnerText;
break;
}
case "pubdate":
{
rssItem.Pubdate = xmlNode.ChildNodes[i].InnerText;
break;
}
case "guid":
{
rssItem.Guid = xmlNode.ChildNodes[i].InnerText;
break;
}
}
}
return rssItem;
}
}
#endregion
#region Html创建类
// 此类提供一种简单的方式将 RssFeed对象转化为简单 HTML文档
public class RssHtmlMaker
{
// 公共属性的成员
private int maxItems = 0;
// 限制 HTML模板中使用%Items%显示和替换的 items的数量
public int MaxItems
{
get
{
return this.maxItems;
}
set
{
this.maxItems = value;
}
}
// 创建HTML文档
public string GetHtmlContents(RssFeed Feed, string Template, string ItemPrefix, string ItemSuffix)
{
string result = Template;
// 替换所有模板令牌
result = result.Replace("%Title%", Feed.Title);
result = result.Replace("%Description%", Feed.Description);
result = result.Replace("%Link%", Feed.Link);
result = result.Replace("%Language%", Feed.Language);
result = result.Replace("%Copyright%", Feed.Copyright);
result = result.Replace("%Webmaster%", Feed.Webmaster);
result = result.Replace("%PubDate%", Feed.PubDate);
result = result.Replace("%LastBuildDate%", Feed.LastBuildDate);
result = result.Replace("%Category%", Feed.Category);
result = result.Replace("%Generator%", Feed.Generator);
result = result.Replace("%Ttl%", Feed.Ttl);
result = result.Replace("%Rating%", Feed.Rating);
result = result.Replace("%Skiphours%", Feed.Skiphours);
result = result.Replace("%Skipdays%", Feed.Skipdays);
result = result.Replace("%ManagingEditor%", Feed.ManagingEditor);
// 解析item模板
string itemsContent = "";
string tempContent = "";
if(maxItems == 0 || maxItems > Feed.Items.Count)
{
maxItems = Feed.Items.Count;
}
for (int i = 0; i < maxItems; i++)
{
// 解析前缀模板
tempContent = ItemPrefix;
tempContent = tempContent.Replace("%Title%", Feed.Items[i].Title);
tempContent = tempContent.Replace("%Description%", Feed.Items[i].Description);
tempContent = tempContent.Replace("%Link%", Feed.Items[i].Link);
tempContent = tempContent.Replace("%Author%", Feed.Items[i].Author);
tempContent = tempContent.Replace("%Comments%", Feed.Items[i].Comments);
tempContent = tempContent.Replace("%Pubdate%", Feed.Items[i].Pubdate);
tempContent = tempContent.Replace("%Guid%", Feed.Items[i].Guid);
itemsContent += tempContent;
// 解析后缀模板
tempContent = ItemSuffix;
tempContent = tempContent.Replace("%Title%", Feed.Items[i].Title);
tempContent = tempContent.Replace("%Description%", Feed.Items[i].Description);
tempContent = tempContent.Replace("%Link%", Feed.Items[i].Link);
tempContent = tempContent.Replace("%Author%", Feed.Items[i].Author);
tempContent = tempContent.Replace("%Comments%", Feed.Items[i].Comments);
tempContent = tempContent.Replace("%Pubdate%", Feed.Items[i].Pubdate);
tempContent = tempContent.Replace("%Guid%", Feed.Items[i].Guid);
itemsContent += tempContent;
}
// 用items替换%items%
result = result.Replace("%Items%",itemsContent);
return result;
}
}
#endregion
#region 数据结构
// 表示一个RSS feed属性的数据结构
[Serializable()]
public struct RssFeed
{
public string Title; // 频道名字
public string Description; // 频道描述
public string Link; // HTML 站点相应频道的 URL
// 可选的项目
public string Language; // 频道所用语言
public string Copyright; // 频道内容版权
public string Webmaster; // 负责频道内容技术问题的 Email地址
public string PubDate; // 频道内容出版日期
public string LastBuildDate;// 频道内容上次更改时间
public string Category; // 频道所属种类
public string Generator; // 标志形成频道所用程序的字符串
public string Ttl; // 刷新缓冲时间
public string Rating; // 频道 PICS等级
public string Skiphours; // 线索
public string Skipdays;
public string ManagingEditor;// 负责编辑内容的 Email地址
public RssItems Items; // RssItem 类型的collection,有RSS feed中的各item
public string ErrorMessage; // 包含错误
}
// 表示RSS feed中单一RSS item的数据结构
[Serializable()]
public struct RssItem
{
public string Title; // 题目URL
public string Description; // 大纲
public string Link; // URL
public string Author; // 作者
public string Comments; // 注释
public string Pubdate; // 发表日期
public string Guid; // item 唯一标志符
}
// 表示RSS feed中RSS items的一个collection
[Serializable()]
public class RssItems : CollectionBase
{
public RssItem this[int item]
{
get
{
return this.getItem(item);
}
}
public void Add(RssItem rssItem)
{
List.Add(rssItem);
}
public bool Remove(int index)
{
if (index > Count - 1 || index < 0)
{
return false;
}
else
{
List.RemoveAt(index);
return true;
}
}
private RssItem getItem(int Index)
{
return (RssItem) List[Index];
}
}
#endregion
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -