Web RSS 生成器 第一部分:为 ASP.NET 和 Silverlight 构建通用 XML 数据源
对开源 Web RSS 生成器的描述
引言
Web RSS Builder 是一款用于使用 Web 和 Silverlight 界面管理 RSS 文件的开源应用程序。当您需要使用 Web 应用程序管理服务器上的 RSS 文件时,此应用程序非常有用。
该应用程序托管在 CodePlex 上,网址为 http://WebRSSBuilder.codeplex.com。
这是三部分帖子的第一部分,将介绍此应用程序
- Web RSS 生成器 第一部分:为 ASP.NET 和 Silverlight 构建通用 XML 数据源
- Web RSS 生成器 第二部分:ASP.NET 应用程序
- Web RSS 生成器 第 3 部分:
Silverlight 应用程序
为什么?
我开始着手这项工作,是因为有人要求我将一个开源的桌面应用程序改编成管理 RSS 文件,而且由于我在一家大公司工作,出于多种原因,我认为有必要转向 Web 应用程序。
- 获取反馈将需要很长时间,并且由于软件中没有嵌入更新机制,您每次更新都需要重新安装它,这对 IT 部门来说是个麻烦。
- 员工将需要对服务器上的文件拥有访问权限,这在安全方面并非真正的好主意。
要求
该应用程序非常简单!要求如下:
- 保留服务器上所有 RSS 文件的列表
- 将每个文件与特定角色关联
- 开发一个 Web 界面来管理 RSS 文件
应用程序架构
该应用程序将包含三个主要项目
- 核心项目:它将包含负责表示和控制 RSS 文件的绑定类。
- ASP.NET 项目:它将包含 ASP.NET Web 应用程序界面。
- Silverlight 项目:实际上是两个:客户端和服务器,它将包含 Silverlight 应用程序界面。
核心组件
该应用程序将使用模型-视图-控制器(MVC)设计模式及其在 Silverlight 中的变体模型-视图-视图模型(MVVM)。核心组件的主要职责是为 ASP.NET 和 Silverlight 使用的 RSS 文件提供通用数据源。
模型
RSS 文件的模型类是
RSSFeed
:表示 RSS 文件,RSS Feed 实现INotifyPropertyChanged
以便在数据发生任何更改时通知绑定对象,它还包含- 属性:例如 Title、Category 等。
- RSS 项目
- c. 索引器
RSSItem
:表示一个 RSS 项目,它也实现INotifyPropertyChanged
以便在数据发生任何更改时通知 Feed 对象,它包含- 属性:例如
Author
、Description
、Pubdata
- 属性:例如
控制器 (Controller)
控制器是负责读取和写入 RSS XML 文件的对象,由于这可以以多种方式完成,因此控制器被抽象为一个接口 IRSSFeedController
。该接口定义了两个基本方法:加载和保存。
namespace WebRSSBuilder.Core
{
public interface IRSSFeedController
{
RSSFeed LoadRss(string FileURI);
void SaveFeed(RSSFeed Feed);
}
}
控制器可以有不同的实现方式
- 使用 XML DOM
- 使用 LINQ to XML
- 使用简单的流文本
- 或许还有其他方式...
在这个阶段,我提供了一个使用 LINQ to XML 的实现,通过 RSSFeedXLinqController
类。对于不熟悉 LINQ to XML 的人,我将简要介绍一下。
此类除了接口 Load
和 Save
方法外,还包含三个辅助方法:
GetElement
:接收一个XElement
,并在其中搜索特定的 XML 标签。GetAttribute
:接收一个XElement
,并在其中搜索特定的 XML 属性。GenerateChannel
:接收一个 Feed 文件并为其生成一个XElement
,代码具有自描述性,如果有人有任何疑问,请随时提出。
private string GetElement(XElement x, string ElementName)
{
XElement Element = x.Element(ElementName);
return (Element == null ? null : Element.Value.Trim());
}
private string GetAttribute(XElement x, string ElementName)
{
string ElementValue = x.Element(channel).Attribute(ElementName).Value;
return (ElementValue == null ? null : ElementValue.Trim());
}
private XElement GenerateChannel(RSSFeed Feed)
{
XElement Channel = new XElement("channel");
#region Saving Properties
if (Feed.Category != null)
Channel.Add(new XElement("category", Feed.Category));
if (Feed.CloudDomain != null)
{
Channel.Add(new XElement("cloud", new XAttribute("domain", Feed.CloudDomain),
new XAttribute("port", Feed.CloudPort),
new XAttribute("registerProcedure", Feed.CloudRegisterProcedure),
new XAttribute("protocol", Feed.CloudProtocol)
));
}
if (Feed.Copyright != null)
Channel.Add(new XElement("copyright", Feed.Copyright));
...
此类实现 IRSSFeedController
LoadRss
:此方法通过GetElement
加载 Feed 属性,并通过LoadItem
加载项目。SaveFeed
:此方法使用GenerateChannel
方法生成XLinq
对象。
public RSSFeed LoadRss(string FileURI)
{
DateTime help;
XElement root = XElement.Load(FileURI);
RSSFeed Feed = new RSSFeed();
XElement Channel = root.Element("channel");
#region Loading properties
Feed.FileName = FileURI;
Feed.Title = GetElement(Channel, "title");
...
#endregion
IEnumerable<xelement> items = from el in Channel.Elements("item") select el;
foreach (XElement item in items)
{
Feed.Items.Add(LoadItem(item));
}
return Feed;
}
private RSSItem LoadItem(XElement x)
{
RSSItem item = new RSSItem();
DateTime help;
bool b;
int i;
item.Author = GetElement(x, "author");
item.Category = GetElement(x, "category");
item.Comments = GetElement(x, "comments");
...
return item;
}
下一篇文章
在下一篇文章中,我们将介绍将使用我们在此处描述的内容绑定到 RSS 数据源的 ASP.NET 应用程序。
你喜欢这篇文章吗?
如果你喜欢,请投票支持它。:)