Парсинг ссылок на новости за последние сутки из RSS

AlexanderWM
Дата: 09.07.2014 23:31:43
Нужно спарсить ссылки на новости, опубликованные за последние сутки. Причём по моему локальному времени, а не по времени сервера. В качестве цели - возьмём Lenta.ru
...
using System.IO;
using System.ServiceModel.Syndication;
using System.Xml;
 
...
 
        private async void button2_Click(object sender, EventArgs e)
        {
            string url = "http://lenta.ru/rss";
 
            XmlReader reader = XmlReader.Create(url, new XmlReaderSettings() { Async = true });
 
            SyndicationFeed feed = SyndicationFeed.Load(reader);
 
            reader.Close();
            foreach (SyndicationItem item in feed.Items)
            {
                String subject = item.Title.Text;
                String summary = item.Summary.Text;
                ...
                MessageBox.Show(subject);
               
 
            }
        }


Вопросы:

1). Как получить саму ссылку на новости?
В фиде такие строки:
<item>
<guid>http://lenta.ru/news/2014/07/08/change/</guid>
<title>Московская полиция предложила штрафовать подающих милостыню</title>
<link>http://lenta.ru/news/2014/07/08/change/</link>
2). На сервер "Ленты" время UTC+4. У меня UTC+3. Нужно перевести моё время в время сервера, и выбрать новости за последние 24 часа. Как сделать перевод?
3). Что-то форма виснет, несмотря на асинхронное создание ридера. В чём дело?
bazile
Дата: 10.07.2014 01:31:17
AlexanderWM,

1. Похоже следует использовать item.Links[0]

2. item.PublishDate.LocalDateTime или item.PublishDate.ToOffset(TimeSpan.FromHours(3)).DateTime

3. XmlReaderSettings.Async всего лишь разрешает использование асинхронных методов. Класс SyndicationFeed был добавлен в .NET 3.5 до появления TPL и async/await. Поэтому никакого эффекта это не оказывает. Тебе нужно самостоятельно реализовать асинхронную загрузку или вынести этот код в отдельный поток. Например можно использовать BackgroundWorker.