在现代互联网中,RSS(Really Simple Syndication)是一种广泛使用的内容聚合方式,它允许用户订阅网站或博客的内容更新。通常,RSS被用来获取新闻、博客文章或其他类型的在线内容。然而,RSS不仅可以用于下载博客文章,还可以用于下载文件。通过在RSS项目中使用
有许多应用程序允许下载播客,它们提供了各种额外的功能,但想要一个简单的应用程序,即使没有登录,也可以按计划任务运行来下载最喜欢的播客。
这个项目使用了VB.NET9.0的一些新XML特性。XML字面量用于创建和更新下载历史的XML文件,而LINQ to XML用于查找尚未下载的附件。
该项目被实现为一个控制台应用程序,以简化起见,但可以很容易地转换为Windows应用程序,甚至Windows服务。所有的工作都是由一个子程序DownloadRSSEnclosures
完成的,它接受RSS源的URL和下载附件的文件夹作为参数。这些参数从命令行参数传递给子程序。
DownloadRSSEnclosures
首先检查下载文件夹中是否存在下载历史的文件。如果存在,它将加载到_DownloadHistoryXml
;如果不存在,它使用XML字面量创建一个新的XML文档,准备保存下载历史。
_DownloadHistoryXml =
使用VB.NET中的XML属性,另一个新特性,定位历史节点以设置last-download-date属性。因为一个XML文档可能包含多个历史节点,DownloadHistoryXml.<history>
实际上返回了一个IEnumerable
的XElement
。知道只有一个节点,所以可以使用LINQ的Single()
扩展方法来选择那个单一的节点,然后继续将其last-download-date属性设置为当前日期/时间。
_DownloadHistoryXml.<history>.Single().SetAttributeValue("last-download-date", DateTime.Now)
下载RSS XML是微不足道的;简单地调用XDocument
的静态Load()
方法将返回一个新的XDocument
,其中包含XML。稍微不那么微不足道的是使用的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
_DownloadHistoryXml.<history>.Single().Add(<download url=<%= _EnclosureUrl %>/>)