Запутался в пространствах имен в ленте Atom - PullRequest
4 голосов
/ 01 июля 2010

Есть ли разница между

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

и

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

Я использую класс SyndicationFeed в .NET для генерации канала 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 выглядит таккоторый добавляет пространство имен к тегу ленты, выглядит следующим образом

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 ]

3 голосов
/ 06 июля 2010

Nevermind. Я понял, что неправильно добавляю пространство имен. Должно быть

feed.AttributeExtensions.Add(
   new XmlQualifiedName("opensearch", "http://www.w3.org/2000/xmlns/"),
   "http://a9.com/-/spec/opensearch/1.1/");
2 голосов
/ 01 июля 2010

* Namespaces 1002 *

Пространства имен по умолчанию наследуются от родительского элемента. Или вы можете определить новые псевдонимы для ваших детей, которые будут использоваться с синтаксисом xmlns:alias=, или вы можете переопределить пространство имен по умолчанию, которое будет использоваться для элемента (и, конечно, его дочерних элементов), используя синтаксис xmlns=.

Вы первый пример:

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

Требуется, чтобы псевдоним пространства имен "opensearch" определялся родительским элементом - возможно, в другом пространстве имен. Например:

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

Хотя это означает, что элемент "myRoot" находится в другом пространстве имен, а именно, по умолчанию (с пустым пространством имен или определено его собственным родителем).

Установка

Чтобы действительно добавить элемент с правильным пространством имен, вам нужно использовать само пространство имен, а не его псевдоним ("opensearch").

Поэтому, чтобы добавить новый элемент, вам нужно либо захватить пространство имен из родительского узла (или просто узнать его и жестко запрограммировать).

1025 * Е.Г. *

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

Но учтите, что вы будете иметь ограниченный или никакой контроль над конкретным псевдонимом, данным вашему пространству имен. Чтобы сделать это, вам нужно будет немного контролировать процесс сериализации XML ...

0 голосов
/ 29 августа 2016

Чтобы быть более полным.

Установить заданное пространство имен в элементе канала с помощью:

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>
...