加载RSS XML时出错:找不到名称空间名称为''的元素'channel'。

时间:2013-04-10 00:43:46

标签: c# .net rss

我有一个例外

var stream = e.Result;
var response = XmlReader.Create(stream);
var feeds = SyndicationFeed.Load(response); // IT IS HERE

例外

  

找不到名称空间名称为''的元素'频道'。 8号线,   位置2。

RSS看起来像:

 <rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
 <atom:link href="http://dallas.example.com/rss.xml" rel="self"
 type="application/rss+xml" /> <channel> <title>News</title>
 <link>http://www.samsung.com/us</link> <description>News</description>
 ...

http://validator.w3.org/feed/说“这是一个有效的RSS Feed。” (你可以在这里查看http://validator.w3.org/feed/check.cgi?url=http%3A%2F%2Fwww.samsung.com%2Fus%2Ffunction%2Frss%2FrssFeedItemList.do%3FctgryCd%3D101%26typeCd%3DNEWS

所以我不知道发生了什么...... :(

我们可以解决方法来取消SyndicationFeed class的某些验证消息吗?

感谢您提供任何解决方案,让我有机会忘记此异常!

2 个答案:

答案 0 :(得分:3)

如果您查看列出的W3验证结果,则会显示:

line 8, column 0: Undocumented use of atom:link 

放置在atom:link元素之前的channel元素导致SyndicationFeed类在加载时失败。您可以通过在本地下载rss feed xml,删除/评论atom:link行并再次运行代码来自行测试。如果没有该行,则会加载xml并找到提要。这个happened beforeSyndicationFeed类。

答案 1 :(得分:1)

由于Michael’s answer,我能够预处理有问题的XML(不受我控制)以移动错误的atom:link元素:

private static readonly XName AtomLink = XName.Get( "link", "http://www.w3.org/2005/Atom" );
private static readonly XName Channel = XName.Get( "channel" );

...
var document = XDocument.Load( stream );
var channel = document.Root.Element( Channel );
foreach( var misplacedLink in document.Root.Elements( AtomLink ) ) {
    misplacedLink.Remove( );
    channel.Add( misplacedLink );
}

using( var reader = document.CreateReader( ) )
    return SyndicationFeed.Load( reader );
相关问题