Читать несколько RSS-каналов - PullRequest
0 голосов
/ 14 февраля 2012

В настоящее время я пытаюсь создать небольшое приложение для чтения RSS на Windows Phone 7.

Пока что я могу отображать отдельные каналы на разных панорамах, и это прекрасно работает.

Однако на моей главной странице я хочу отображать самые последние новости, поступающие из нескольких RSS-каналов.

Например, у меня есть feed1, feed2 на разных страницах, и я хотел бы показать заголовок самых последних новостей из feed1 и feed2 (или более) на моей домашней странице.

Вот код, который я использовал для своих отдельных каналов

Mainpage_Loaded:

WebClient wc = new WebClient();
wc.DownloadStringAsync(new Uri("feed-goes-here"));
wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);

А затем:

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {

            if (e.Error != null) return;

            XElement xmlItems = XElement.Parse(e.Result);

            listBox1.ItemsSource = from x in xmlItems.Descendants("item")
                                   where x.Element("enclosure") != null && x.Element("description") != null
                                   select new RSSitem 
                                   {
                                       Description = x.Element("description").Value.Substring(0,100)+"...", 
                                       Title = x.Element("title").Value,
                                       ImageSource = x.Element("enclosure").FirstAttribute.Value 
                                   };

        }

I 'Я тестировал множество методов, чтобы решить мою проблему, но все еще не смог найти ответ.

Итак, мой вопрос: как мне отобразить в списке самые последние новости из двух разных фидов одного и того жестраница?Спасибо за вашу помощь и за ваше время.

1 Ответ

0 голосов
/ 16 февраля 2012

Во-первых, я бы рекомендовал добавить свойство Date в RSSItem:

public class RSSItem
{
    public DateTime Date { get; set; }
    public string Description { get; set; }
    public string Title { get; set; }
    public string ImageSource { get; set; }
}

Таким образом, когда вы загружаете два RSS-канала, вы можете объединить их и отсортировать по дате:

private IEnumerable<RSSItem> Weave(List<RSSItem> feed1, List<RSSItem> feed2)
{
    return feed1.Concat(feed2)
        .OrderByDescending(i => i.Date)
        .Take(10); // Grab the ten most recent entries
}

Использование:

using System.Linq; // Don't forget to add using statement for System.Linq

public class RssReader
{
    private List<IEnumerable<RSSItem>> _feeds = new List<IEnumerable<RSSItem>>();

    public void Download()
    {
        WebClient wc = new WebClient();
        wc.DownloadStringCompleted += this.FeedDownloaded;
        wc.DownloadStringAsync(new Uri("feed-goes-here"));
    }

    private void FeedDownloaded(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error != null) return;

        var xml = XElement.Parse(e.Result);
        var feed = from x in xml.Descendants("item")
                   where x.Element("enclosure") != null && x.Element("description") != null
                   select new RSSItem()
                   {
                       Date = DateTime.Parse(x.Element("date").Value),
                       Title = x.Element("title").Value,
                       ImageSource = x.Element("enclosure").FirstAttribute.Value
                   };

        _feeds.Add(feed);

        if (_feeds.Count == 2)
        {
            var result = this.Weave(_feeds[0], _feeds[1]);

            // Assign result to the list box's ItemSource
            // Or better, use data binding.
        }
    }

    /// <summary>
    /// Combines the two feeds, sorts them by date, and returns the ten most recent entries.
    /// </summary>
    private IEnumerable<RSSItem> Weave(IEnumerable<RSSItem> feed1, IEnumerable<RSSItem> feed2)
    {
        return feed1.Concat(feed2)
            .OrderByDescending(i => i.Date)
            .Take(10);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...