Исключения при разборе DateTime в ленте RSS в C#

Я пытаюсь разобрать каналы Rss2, Atom, используя объекты SyndicationFeedFormatter и SyndicationFeed. Но я получаю XmlExceptions при разборе поля DateTime, например pubDate и / или lastBuildDate.

Ср, 24 Фев 2010 18:56:04 GMT+00:00 не работает

Ср, 24 фев 2010 18:56:04 GMT работает

Таким образом, это бросок из-за поля часового пояса.

В качестве обходного пути для знакомых каналов я бы вручную исправлял эти узлы DateTime - перехватывая XmlException, загружая Rss в XmlDocument, исправляя значение этих узлов, создавая новый XmlReader, а затем возвращая средство форматирования из этого нового объекта XmlReader (код не показано). Но чтобы этот подход работал, мне нужно заранее знать, какие узлы вызывают исключение.

        SyndicationFeedFormatter syndicationFeedFormatter = null;
        XmlReaderSettings settings = new XmlReaderSettings();
        using (XmlReader reader = XmlReader.Create(url, settings))
        {
            try
            {
                syndicationFeedFormatter = SyndicationFormatterFactory.CreateFeedFormatter(reader);
                syndicationFeedFormatter.ReadFrom(reader);
            }
            catch (XmlException xexp)
            {
                // fix those datetime nodes with exceptions and read again.
            }
        return syndicationFeedFormatter;
    }

RSS-канал: http://news.google.com/news?pz=1&cf=all&ned=us&hl=en&q=test&cf=all&output=rss

исключения исключения:

Ошибка XmlException в строке 1, позиция 376. Произошла ошибка при синтаксическом анализе значения DateTime в XML.
в System.ServiceModel.Syndication.Rss20FeedFormatter.DateFromString(String dateTimeString, читатель XmlReader)
в System.ServiceModel.Syndication.Rss20FeedFormatter.ReadXml(читатель XmlReader, результат SyndicationFeed) в System.ServiceModel.Syndication.Rss20FeedFormatter.ReadFrom(читатель XmlReader) в... cs: строка 171

<rss version="2.0">
  <channel>
    ...
    <pubDate>Wed, 24 Feb 2010 18:56:04 GMT+00:00</pubDate>
    <lastBuildDate>Wed, 24 Feb 2010 18:56:04 GMT+00:00</lastBuildDate> <-----exception
    ...
    <item>
      ...
      <pubDate>Wed, 24 Feb 2010 16:17:50 GMT+00:00</pubDate>
      <lastBuildDate>Wed, 24 Feb 2010 18:56:04 GMT+00:00</lastBuildDate>
    </item>
    ...
  </channel>
</rss>

Есть ли лучший способ добиться этого? Пожалуйста помоги. Благодарю.

2 ответа

Вот мой хакерский обходной путь для чтения RSS-каналов Новостей Google.

string xml;
using (WebClient webClient = new WebClient())
{
    xml = Encoding.UTF8.GetString(webClient.DownloadData(url));
}
xml = xml.Replace("+00:00", "");
byte[] bytes = System.Text.UTF8Encoding.ASCII.GetBytes(xml);  
XmlReader reader = XmlReader.Create(new MemoryStream(bytes));
SyndicationFeed feed = SyndicationFeed.Load(reader);

Конвертировать PublishDate в RSS на ваш компьютер

  string dateStr = item.PublishDate.ToString("ddd MMM dd HH:mm:ss zzzz yyyy");
                    DateTime PostDate = DateTime.ParseExact(dateStr, "ddd MMM dd HH:mm:ss zzzz yyyy", CultureInfo.InvariantCulture);
Другие вопросы по тегам