2010-07-01 1 views
4

Есть ли разница междуConfused о пространствах имен в кормах Atom

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

и

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

Я использую класс SyndicationFeed в .NET для создания фид Atom, и мне нужно, чтобы добавить некоторые элементы для стандарта opensearch, но он продолжает добавлять такие элементы, как предыдущий, когда я хочу, чтобы они добавляли их, как и предыдущие.

Код:

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

EDIT

Корневой канал тег выглядит следующим образом

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

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

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

Namespaces

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

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

E.g.

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

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

+0

Интересно, если пространство имен в родительский тег испорчен. См. Мое редактирование; Я объясню больше. – Jagd

+0

Когда вы говорите, что я мало контролирую псевдоним, заданный пространству имен, ссылаетесь ли вы на атрибут p1: opensearch, который я заканчиваю в теге корневого фида? – Jagd

+0

Что касается «контроля» конкретного псевдонима, который получил результат, я считаю, что вам нужно будет зарегистрировать пространство имен/псевдоним выше в документе при его записи/сериализации. Я не уверен, как SynchronizationFeed сериализуется, так что боюсь, что я не очень помогаю оттуда ... – Reddog

0

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

Set указать пространство имен на канале элемента с:

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>