RSS 附件下载器





0/5 (0投票)
使用 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>
实际上返回 XElement
的 IEnumerable
。 我们知道只有一个节点,所以我们可以使用 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日 - 原始文章发布。