hIp*_*pPy 6 rss datetime parsing exception xmlexception
我正在尝试使用SyndicationFeedFormatter和SyndicationFeed对象解析Rss2,Atom提要.但是我在解析DateTime字段时得到了XmlExceptions,比如pubDate和/或lastBuildDate.
2010年2月24日星期三18:56:04 GMT + 00:00不起作用
2010年2月24日星期三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;
}
Run Code Online (Sandbox Code Playgroud)
rss feed:http://news.google.com/news?pz = 1&cf = all&aned = us&hl = en&q = test&cf = all&output = rss
例外情况:
第1行中的XmlException错误376.解析XML中的DateTime值时遇到错误.
在System.ServiceModel.Syndication.Rss20FeedFormatter.DateFromString(String dateTimeString,XmlReader reader)
的System.ServiceModel.Syndication.Rss20FeedFormatter.ReadXml(XmlReader reader,SyndicationFeed result)at System.ServiceModel.Syndication.Rss20FeedFormatter.ReadFrom(XmlReader reader)at. .. 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>
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来实现这一目标?请帮忙.谢谢.
Jam*_*ruk 10
以下是我阅读Google新闻RSS源的hacky解决方法.
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);
Run Code Online (Sandbox Code Playgroud)