结合两个联合供稿

时间:2020-03-05 18:57:42  来源:igfitidea点击:

合并feed和feed2的简单方法是什么?我希望将feed2中的项目添加到feed中。我也想避免重复,因为当同时用WPF和Silverlight标记问题时,提要中可能已经有项目。

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);

解决方案

回答

如果仅用于stackoverflow,则可以使用以下命令:
https://stackoverflow.com/feeds/tag/silverlight%20wpf
这将完成两个标签的并集。

对于更一般的解决方案,我不知道。我们可能必须手动迭代两个提要的元素,然后将它们结合在一起。我们可以比较<entry>的<id>元素以查看它们是否重复。

回答

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

类似于以下内容:

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

也许可以做到。看起来"项目"是一个简单可编号的联合组织列表,因此没有理由不能简单地添加它们。

回答

我们可以使用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();
            }
        }
    }
}