Я пытаюсь разобрать каналы 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>
Есть ли лучший способ добиться этого? Пожалуйста помоги. Благодарю.