2008-09-17 8 views
9

Was ist ein einfacher Weg zu kombinieren Feed und feed2? Ich möchte die Artikel von feed2 zu Feed hinzugefügt werden. Auch möchte ich vermeiden, dass Duplikate feed möglicherweise bereits Elemente haben, wenn eine Frage mit WPF und Silverlight markiert ist.Kombination von zwei SyndicationFeds

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

Antwort

10

Sie können LINQ verwenden, um den Code zu vereinfachen, um zwei Listen zu verbinden (vergessen Sie nicht, System.Linq in Ihre Anwendungen einzufügen und bei Bedarf auf System.Core in Ihrem Projekt zu verweisen) Hier ist ein Main, der die Union ausführt und sie druckt zu trösten (mit richtiger Säuberung des Readers).

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

LINQ und UNION ... das ist Genie. Ich hatte gehofft, dass ich nicht durch die Feeds iterieren und das passt zur Rechnung. –

+0

Süß! Vielen Dank! +1 – Charles

+0

Genius Lösung. Vielen Dank. –

0

Wenn es nur für Stackoverflow ist, können Sie diese verwenden:
https://stackoverflow.com/feeds/tag/silverlight%20wpf
Diese wird tun, um eine Vereinigung der beiden Tags.

Für eine allgemeinere Lösung, weiß ich nicht. Sie müssten wahrscheinlich die Elemente der beiden Feeds manuell iterieren und sie zusammenfügen. Sie können die < ID> Elemente von < Eintrag> s vergleichen, um zu sehen, ob sie Duplikate sind.

+0

Ich denke, es ist, dass macht ein UND statt eines ODER. Ich denke, ich muss die Feeds zusammenführen. –

+0

Ich habe gerade überprüft und es ist ein OR –

+0

nach diesem Beitrag, es macht ein UND. Ich denke, ich muss auf die UNION-Funktionalität warten, bevor ich die RESTFUL-Tags uri verwenden kann. In der Zwischenzeit muss ich es selbst durchlaufen und manuell machen. http://StackOverflow.com/Questions/61590/Stack-Overflow-Tag-Filtering –

1

Nun, eine Möglichkeit besteht darin, einen neuen Syndikations-Feed zu erstellen, der ein Klon des ersten Feeds ist, und dann einfach durch jeden Beitrag auf dem zweiten iterieren, den ersten für seine Existenz prüfen und ihn hinzufügen, wenn er es nicht tut. t existieren.

Etwas entlang der Linien von:

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

könnte in der Lage sein, es zu tun. Es sieht so aus, als wäre 'Objekte' eine einfache Liste von Syndication-Elementen, also gibt es keinen Grund, warum man sie nicht einfach hinzufügen kann.

+0

Ich denke nicht, dass ein einfaches Contains() es tun wird. Er muss wahrscheinlich die Eintrags-IDs vergleichen –

+0

RSS-Elemente werden empfohlen, ein Guid-Element zu haben, aber es ist nicht erforderlich. Wird bei der Kombination zuerst die Inklusion bestimmen müssen, indem man zuerst guid vergleicht. Wenn guid nicht vorhanden ist, vergleichen Sie die Verknüpfungselemente. Kann auch mit Titel verglichen werden, um sicher zu sein. – Oppositional

0

Ich habe gedreht heutige akzeptierte Antwort zu einer Einheit Test nur diese leicht zu erkunden:

[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."); 
    } 
0
 //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); 
0

Das ist für mich gut funktioniert:

// 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 
Verwandte Themen