2013-03-28 53 views
10

我使用System.ServiceModel.Syndication.SyndicationFeed创建一个RSS feed从我得到这个:SyndicationFeed改变命名空间前缀原子

<rss xmlns:a10="http://www.w3.org/2005/Atom" version="2.0"><channel>...</channel></rss> 

这是所有工作顺顺当当的,除了当我validate my feed

验证器抱怨a10命名空间前缀,并建议我改用atom。这听起来很合理......除了我看不到改变前缀的简单方法。

有关更改前缀方式的任何想法?

+0

这看起来像你有实际输出供稿作为RSS 2.0,而不是1.0 ATOM - 看到不同的XML输出示例在http://msdn.microsoft.com/en-us/library/system。 servicemodel.syndication.syndicationfeed.aspx#code-snippet-3 – CBroe 2013-03-28 10:11:16

+1

是的,它是rss,这是我所期待的。无论出于何种原因,Feed验证器建议使用原子名称空间链接到自我,所以我只是试图坚持。我添加了这样的链接 - 但验证者希望a10成为原子。 – 2013-03-28 10:20:27

+0

验证器的警告只是一个建议。没有理由你不应该改变前缀,但没有有效的解析器关心这种差异。 – Joe 2013-03-28 12:01:17

回答

18

要为您需要在饲料格式化禁用SerializeExtensionsAsAtom原子扩展指定自定义名称:

var formatter = feed.GetRss20Formatter(); 
formatter.SerializeExtensionsAsAtom = false; 

然后你需要添加命名空间

XNamespace atom = "http://www.w3.org/2005/Atom"; 

feed.AttributeExtensions.Add(new XmlQualifiedName("atom", XNamespace.Xmlns.NamespaceName), atom.NamespaceName); 

现在你可以开始使用扩展

feed.ElementExtensions.Add(new XElement(atom + "link", new XAttribute("href", feedLink), new XAttribute("rel", "self"), new XAttribute("type", "application/rss+xml"))); 

最后将订阅源写入响应链L:

formatter.WriteTo(new XmlTextWriter(Response.Output));