2011-04-22 36 views
2

我有一个RSS源URL,可以在任何源阅读器中查看。
This RSS feed is not controlled by me,it only only by me。
This RSS Feed(Office of Inspector General's Excluded Provider List)链接到具有可下载文件的页面。如何在更新RSS源时触发可执行文件

这些文件每月大约更新一次,RSS源显示新的“未读”项目。

我想要做的是写一些(每周一次)检查这个RSS Feed的东西,并且当一个新的项目(即一个新的可下载的文件)可用时,触发一个可执行文件。

这实际上就像是一个非常小巧的RSS阅读器,其唯一目的是在出现新项目时触发可执行文件。

任何指导,建议将不胜感激。

编辑:

  • 我需要在确定帮助时,一个新的 项目为 下载变为可用。
  • 我可以执行一个 可执行文件的运行。
  • 将运行的可执行文件 将处理 下载的文件。
+4

哪个部位有问题?您是否需要帮助来确定是否有新项目,或者在确定有新项目时您需要知道如何启动可执行文件? – 2011-04-22 19:26:35

回答

2

作为一个评论者已经指出的那样,这个问题是相当广泛的,但在这里是为了回答:

  • 您可以编写Windows服务(使用随VS模板/ MonoDevelop),或者您可以编写一个简单的控制台应用程序,该应用程序将由Windows Scheduler或Cron调用。

  • 主要的代码将使用现有的许多RSS提要解析器之一:

有很多在这里SO例子。国际海事组织,最简单的基于LINQ的是here

我个人喜欢this approach,也使用LINQ。

  • 一旦你解析饲料,你需要寻找的Link元素的值,从上面的例子SO做这个发现:

....

var feeds = from feed in feedXML.Descendants("item") 
       select new 
       { 
       Title = feed.Element("title").Value, 
       **Link** = feed.Element("link").Value, 
       Description = feed.Element("description").Value 
       }; 

....

  • 所以,现在您有可执行文件,则需要将其下载到您的计算机。我建议你看看this example from MSDN
  • 现在,你已经下载了这个文件,简单的用Process.Start("Path to EXE");来执行它。

小心病毒在exes!

+1

我想他会运行一个已经在他的系统上的特定可执行文件,并从新项目中传递信息。我很确定他没有运行下载的可执行文件。 – 2011-04-22 21:01:42

+0

这是正确的@Jim。 – funkymushroom 2011-04-23 18:45:07

+0

我想这正是我要做的,感谢您的帮助 – funkymushroom 2011-04-23 18:48:18

1

因此,您必须从URL读取RSS订阅源,然后解析数据以确定是否有新项目可用。

要阅读Feed,您需要使用WebClient。最简单的方法:

var MyClient = new WebClient(); 
string rssData = MyClient.DownloadString("http://whatever"); 

然后,您可以从返回的字符串中创建一个XML文档。

var feedXML = new XMlDocument(); 
feedXML.Load(rssData); 

@dawebber演示了如何使用LINQ解析XML。您需要检查每个项目的日期,以查看它是否比检查的上一个日期更新。或者你可能有一个你已经看过的项目数据库,并且你想检查你收到的项目是否在数据库中。

每当您找到新项目时,您都可以使用Process.Start来启动您的可执行文件。

+0

这有一些很好的信息...谢谢。 – funkymushroom 2011-04-23 18:45:48

2

如果您使用的是.NET 3.5或以上你可以在你的System.ServiceModel.Syndication命名空间中的各种类,特别是SyndicationFeed类暴露,你可以用它来比较日期,知道什么时候使用Process.Start打电话给你的可执行LastUpdatedTime属性方法在System.Diagnostics名称空间中。

  using (XmlReader reader = XmlReader.Create(path)) 
      { 
       SyndicationFeed feed = SyndicationFeed.Load(reader); 

       if ((feed != null) && (feed.LastUpdateTime > feedLastUpdated)) 
       { 
        // Launch Process        
       } 
      } 
+0

我也试过这个,但事实证明,我试图读取的Feed没有提供任何LastUpdateTime。他们是否有可能不提供该领域的饲料?我得到了一个空值类型的日期值(类似于该字段中的“01/01/0001”)。 – funkymushroom 2011-05-05 17:48:15