Question

Qu'est-ce qu'un moyen simple de combiner flux et flux2 ? Je souhaite que les éléments de feed2 soient ajoutés à feed . De plus, je souhaite éviter les doublons, car les flux peuvent déjà contenir des éléments lorsqu'une question est étiquetée à la fois avec WPF et 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);
Était-ce utile?

La solution

Vous pouvez utiliser LINQ pour simplifier le code afin de joindre deux listes (n'oubliez pas de mettre System.Linq dans vos utilisations et, si nécessaire, de faire référence à System.Core dans votre projet) Voici un Main qui effectue l'union et les imprime console (avec un nettoyage approprié du Reader).

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

Autres conseils

Eh bien, une possibilité est de créer un nouveau flux de syndication qui est un clone du premier flux, puis de simplement réitérer chaque publication sur le second, de vérifier l'existence du premier et de l'ajouter s'il ne fonctionne pas. exister.

Quelque chose dans le sens de:

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

pourrait peut-être le faire. Il semble que "items" soit une simple liste énombrable d’articles de syndication, il n’ya donc aucune raison pour laquelle vous ne pouvez pas les ajouter.

Si c'est uniquement pour stackoverflow, vous pouvez utiliser ceci:
https://stackoverflow.com/feeds/tag/silverlight%20wpf
Cette volonté fera l'union des deux tags.

Pour une solution plus générale, je ne sais pas. Vous devrez probablement itérer manuellement les éléments des deux flux et les réunir. Vous pouvez comparer le & Lt; id & Gt; éléments de < entrée > s pour voir s’ils sont en double.

J'ai transformé la réponse acceptée aujourd'hui en test unitaire juste pour explorer légèrement ce sujet:

    [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<bool>(
            () =>
            {
                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);

Cela a bien fonctionné pour moi:

// create temporary List of SyndicationItem's
List<SyndicationItem> tempItems = new List<SyndicationItem>();

// 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top