65.9K
CodeProject 正在变化。 阅读更多。
Home

RSS 附件下载器

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2008年6月3日

CPOL

3分钟阅读

viewsIcon

33123

downloadIcon

185

使用 LINQ to XML 下载 RSS 附件。

引言

大多数人熟悉 RSS(简易信息聚合)作为下载博客文章的方法,但它也可以用作下载文件的方式。在 item 中使用 <enclosure> 标签允许文件与该 item 相关联,就像电子邮件中的附件一样。

这种机制主要被播客用户用来分发他们的节目。

有许多应用程序允许下载播客,并提供各种附加功能,但我想要一个简单的应用程序,我可以作为计划任务运行(即使我没有登录)来下载我喜欢的播客。

背景

这个项目使用了 VB.NET 9.0 的一些新的 XML 功能。 XML 字面量用于创建和更新下载历史 XML 文件,而 LINQ to XML 用于查找尚未下载的任何附件。

Using the Code

为了简单起见,该项目已实现为一个控制台应用程序,但可以很容易地转换为 Windows 应用程序,甚至 Windows 服务。所有工作都由一个子例程完成,DownloadRSSEnclosures,它接受 RSS 源的 URL 和下载附件到的文件夹作为参数。这些参数从命令行参数传递到子例程。

DownloadRSSEnclosures 做的第一件事是检查源的下载文件夹中是否存在下载历史文件。 如果它存在,它将其加载到 _DownloadHistoryXml 中; 如果不存在,它使用 XML 字面量创建一个新的 XML 文档,准备保存下载历史记录。

_DownloadHistoryXml = <?xml version="1.0" encoding="UTF-8"?><history/>

使用 XML 属性(VB.NET 中的另一个新功能),可以找到历史记录节点以设置 last-download-date 属性。 因为 XML 文档可能包含多个历史记录节点,所以 DownloadHistoryXml.<history> 实际上返回 XElementIEnumerable。 我们知道只有一个节点,所以我们可以使用 LINQ Single() 扩展方法来选择该单个节点,然后再将其 last-download-date 属性设置为当前日期/时间。

_DownloadHistoryXml.<history>.Single().SetAttributeValue("last-download-date", DateTime.Now)

下载 RSS XML 非常简单;只需调用 XDocument 的静态 Load() 方法将返回一个包含 XML 的新 XDocument。 稍微不那么简单的是 LINQ to XML,它用于选择 RSS 源中所有尚未存在于下载历史记录中的附件的 URL。

Dim _NewEnclosures = _ 
        From enclosure In _RssXml.<rss>.<channel>.<item>.<enclosure> _ 
        Where Not (From download In _DownloadHistoryXml.<history>.<download> Select 
            download.@url).Contains(enclosure.@url) _ 
        Select enclosure.@url

使用 LINQ 返回尚未下载的 URL 列表,可以使用简单的 For Each 循环来下载每个文件,将其保存到下载文件夹,并更新历史记录(在下载每个文件后保存它,以防应用程序在完成之前终止)。 下载循环中唯一值得关注的点是将下载添加到历史 XML 文件的方式。 请注意如何再次使用 XML 字面量来创建 XML 节点(带有 wmbedded 表达式来插入 URL),该节点已添加到历史记录节点。

_DownloadHistoryXml.<history>.Single().Add(<download url=<%= _EnclosureUrl %>/>)

历史

  • 2008年6月3日 - 原始文章发布。
© . All rights reserved.