合并两个SyndicationFeeds

什么是组合Feedfeed2的简单方法? 我希望将feed2中的项添加到Feed中 。 此外,我想避免重复,因为当使用WPF和Silverlight标记问题时, Feed可能已经有项目。

Uri feedUri = new Uri("http://stackoverflow.com/feeds/tag/silverlight"); XmlReader reader = XmlReader.Create(feedUri.AbsoluteUri); SyndicationFeed feed = SyndicationFeed.Load(reader); Uri feed2Uri = new Uri("http://stackoverflow.com/feeds/tag/wpf"); XmlReader reader2 = XmlReader.Create(feed2Uri.AbsoluteUri); SyndicationFeed feed2 = SyndicationFeed.Load(reader2); 

您可以使用LINQ来简化代码以加入两个列表(不要忘记将System.Linq放入您的使用中,如果需要,请在项目中引用System.Core)这是一个Main,它将联合并打印到控制台(带适当清理读者)。

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.ServiceModel.Syndication; namespace FeedUnion { class Program { static void Main(string[] args) { Uri feedUri = new Uri("http://stackoverflow.com/feeds/tag/silverlight"); SyndicationFeed feed; SyndicationFeed feed2; using(XmlReader reader = XmlReader.Create(feedUri.AbsoluteUri)) { feed= SyndicationFeed.Load(reader); } Uri feed2Uri = new Uri("http://stackoverflow.com/feeds/tag/wpf"); using (XmlReader reader2 = XmlReader.Create(feed2Uri.AbsoluteUri)) { feed2 = SyndicationFeed.Load(reader2); } SyndicationFeed feed3 = new SyndicationFeed(feed.Items.Union(feed2.Items)); StringBuilder builder = new StringBuilder(); using (XmlWriter writer = XmlWriter.Create(builder)) { feed3.SaveAsRss20(writer); System.Console.Write(builder.ToString()); System.Console.Read(); } } } } 

好吧,一种可能性是创建一个新的联合供稿,它是第一个供稿的克隆,然后简单地遍历第二个上的每个post,检查第一个是否存在,如果它不存在则添加它。

有点像:

 SyndicationFeed newFeed = feed.clone; foreach(SyndicationItem item in feed2.items) { if (!newFeed.contains(item)) newFeed.items.Add(item); } 

也许能够做到。 看起来’items’是一个简单的可枚举的联合项目列表,所以不能让你不能简单地添加它们。

如果它仅用于stackoverflow,您可以使用:
https://stackoverflow.com/feeds/tag/silverlight%20wpf
做两个标签的联合。

对于更通用的解决方案,我不知道。 您可能必须手动迭代两个Feed的元素并将它们连接在一起。 您可以比较元素以查看它们是否重复。

我已将今天接受的答案转变为unit testing,只是为了稍微探讨一下:

  [TestMethod] public void ShouldCombineRssFeeds() { //reference: http://stackoverflow.com/questions/79197/combining-two-syndicationfeeds SyndicationFeed feed; SyndicationFeed feed2; var feedUri = new Uri("http://stackoverflow.com/feeds/tag/silverlight"); using(var reader = XmlReader.Create(feedUri.AbsoluteUri)) { feed = SyndicationFeed.Load(reader); } Assert.IsTrue(feed.Items.Count() > 0, "The expected feed items are not here."); var feed2Uri = new Uri("http://stackoverflow.com/feeds/tag/wpf"); using(var reader2 = XmlReader.Create(feed2Uri.AbsoluteUri)) { feed2 = SyndicationFeed.Load(reader2); } Assert.IsTrue(feed2.Items.Count() > 0, "The expected feed items are not here."); var feedsCombined = new SyndicationFeed(feed.Items.Union(feed2.Items)); Assert.IsTrue( feedsCombined.Items.Count() == feed.Items.Count() + feed2.Items.Count(), "The expected number of combined feed items are not here."); var builder = new StringBuilder(); using(var writer = XmlWriter.Create(builder)) { feedsCombined.SaveAsRss20(writer); writer.Flush(); writer.Close(); } var xmlString = builder.ToString(); Assert.IsTrue(new Func( () => { var test = false; var xDoc = XDocument.Parse(xmlString); var count = xDoc.Root.Element("channel").Elements("item").Count(); test = (count == feedsCombined.Items.Count()); return test; } ).Invoke(), "The expected number of RSS items are not here."); } 
  //Executed and Tested :) using (XmlReader reader = XmlReader.Create(strFeed)) { rssData = SyndicationFeed.Load(reader); model.BlogFeed = rssData; ; } using (XmlReader reader = XmlReader.Create(strFeed1)) { rssData1 = SyndicationFeed.Load(reader); model.BlogFeed = rssData1; } SyndicationFeed feed3 = new SyndicationFeed(rssData.Items.Union(rssData1.Items)); model.BlogFeed = feed3; return View(model); 

这对我很好:

 // create temporary List of SyndicationItem's List tempItems = new List(); // add all feed items to the list tempItems.AddRange(feed.Items); tempItems.AddRange(feed2.Items); // remove duplicates with Linq 'Distinct()'-method depending on yourattributes // add list without duplicates to 'feed2' feed2.Items = tempItems