对Atom feed中的命名空间感到困惑

时间:2010-07-01 17:55:54

标签: .net feed atom-feed opensearch syndicationfeed

之间有什么区别吗?
<opensearch:totalResults>1000</opensearch:totalResults>

<totalResults xmlns="opensearch">1000</totalResults>

我正在使用.NET中的SyndicationFeed类来生成Atom提要,我需要为opensearch标准添加一些元素,但是当我希望它添加像上面那样的元素时,它会继续添加上面的元素前者。

代码:

feed.ElementExtensions.Add("totalResults", "opensearch", "2");

修改

根源标记看起来像这样

<feed xml:lang="en-US" p1:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:p1="xmlns" xmlns="http://www.w3.org/2005/Atom">

将我的代码更改为@Reddog建议后,totalresults元素看起来像这样

<totalResults xmlns="http://a9.com/-/spec/opensearch/1.1/">1000</totalResults>

将命名空间添加到feed标记的代码如下所示

feed.AttributeExtensions.Add(
    new XmlQualifiedName("opensearch", "xmlns"),
    @"http://a9.com/-/spec/opensearch/1.1/");

添加totalresults元素的代码现在看起来像这样

feed.ElementExtensions.Add("totalResults", @"http://a9.com/-/spec/opensearch/1.1/", "1000");

3 个答案:

答案 0 :(得分:3)

没关系。我意识到我错误地添加了命名空间。它应该是

feed.AttributeExtensions.Add(
   new XmlQualifiedName("opensearch", "http://www.w3.org/2000/xmlns/"),
   "http://a9.com/-/spec/opensearch/1.1/");

答案 1 :(得分:2)

<强>命名空间

默认名称空间是从父元素继承的。或者,您可以为子项定义新的别名以使用xmlns:alias=语法,或者您可以使用xmlns=语法重新定义要用于元素(当然还有子元素)的默认命名空间。 / p>

你的第一个例子:

<opensearch:totalResults>1000</opensearch:totalResults>

要求“opensearch”命名空间别名由父元素定义 - 可能在不同的命名空间中。例如:

<myRoot xmlms:opensearch="http://a9.com/-/spec/opensearch/1.1/">
    <opensearch:totalResults>1000</opensearch:totalResults>
</myRoot>

虽然这意味着“myRoot”元素位于不同的命名空间中 - 即默认命名空间(具有空白命名空间或由其自己的父命名空间定义)。

<强>插入

为了实际添加具有正确名称空间的元素,您需要使用名称空间本身,而不是它的别名(“opensearch”)。

因此,要添加新元素,您需要从父节点中获取命名空间(或者只知道它并对其进行硬编码)。

E.g。

feed.ElementExtensions.Add("totalResults", "http://a9.com/-/spec/opensearch/1.1/", 1000);

但请注意,您对命名空间的特定别名的控制有限或无法控制。为此,您必须控制XML序列化过程...

答案 2 :(得分:0)

更完整。

使用以下命令在channel元素上设置指定名称空间:

feed.AttributeExtensions.Add(
  new XmlQualifiedName("opensearch", XNamespace.Xmlns.ToString()),
 "http://a9.com/-/spec/opensearch/1.1/");

并在totalResults上指定名称空间:

feed.ElementExtensions.Add("totalResults", "http://a9.com/-/spec/opensearch/1.1/", "1000");

那会给你:

<opensearch:totalResults>1000</opensearch:totalResults>