Вопрос

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

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

а также

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

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

После изменения моего кода AS @reddog элемент TotalResults выглядит так

<totalResults xmlns="http://a9.com/-/spec/opensearch/1.1/">1000</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");
Это было полезно?

Решение

Неважно. Я понял, что неправильно добавил пространство имен. Так должно быть

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

Другие советы

Пространства имен

Пространства имен по умолчанию унаследованы от родительского элемента. Илиначе вы можете определить новые псевдонимы для ваших детей, чтобы использовать с 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» элемент находится в другом пространстве имен - а именно, по умолчанию One (с пустым пространством имен или определенным своим собственным родителем).

Вставка

Чтобы на самом деле добавить элемент с правильным пространством имен, вам нужно будет использовать само пространство имен, а не псевдоним («OpenSearch»).

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

Например

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

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

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

Установите Уточните пространство имен на элемент канала с:

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>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top