Исключения при разборе 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);