Как использовать With XMLNamespaces для создания настраиваемых пространств имен в SQL?

Я хочу иметь возможность создавать следующие пространства имен и типы для корневого элемента XML.

<BaseTransactionRequest xmlns="http://schemas.datacontract.org/2004/07/SomeCompany" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" i:type="AType">

Обычно первые 2 (то есть, не включая i:type="AType") могут быть созданы без проблем (с некоторыми компромиссами, при использовании пользовательских пространств имен мы не можем представлять нули, используя пространство имен xmlns:ni и т. д.). Таким образом, последний тип проблемный. Для реферера используется страховка WITH XMLNAMESPACES, как показано ниже (часть FOR XML опущена):

;WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' as i, DEFAULT 'http://schemas.datacontract.org/2004/07/SomeCompany',

Решение, которое нужно преодолеть, состояло в том, чтобы написать XML «буквально», используя конкатенацию строк. Но я верю и надеюсь, что XML можно использовать вместе.

РЕДАКТИРОВАТЬ: Первая версия была добавлена ​​в спешке. Извинения. EDIT2: исправление дислексии


person brumScouse    schedule 20.03.2018    source источник
comment
;WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' as i, DEFAULT 'http://schemas.datacontract.org/2004/07/SomeCompany') select 'AType' as [i:Type] from (select 1 as ID) t for xml raw('BaseTransactionRequest'), кажется, создает именно тот XML, который вы запрашиваете. Так в чем проблема? Было бы полезно, если бы вы не смогли выполнить эту работу, если бы вы могли создать полный образец, а не просто предоставить нам фрагмент для работы.   -  person Damien_The_Unbeliever    schedule 21.03.2018
comment
@Damien_The_Unbeliever выдвинул ту же идею, в ту же минуту ... Я думаю, что ОП ошибочно воспринимает i:type="AType" как своего рода пространство имен ...   -  person Shnugo    schedule 21.03.2018
comment
@Дамиан Спасибо. Вы предоставили мне решение. У меня была проблема, у тебя нет. Если я чего-то не знаю, то обязательно задам вопросы. Отличная работа.   -  person brumScouse    schedule 21.03.2018
comment
ОП, безусловно, ошибочно принимает пространство имен за что-то другое. Вы многому научились, могли без хохота рассказать мне о неспособности что-то различить. Ужасный снобизм с обеих сторон.   -  person brumScouse    schedule 21.03.2018
comment
@brumScouse Что здесь не так? Почему ты невежлив? Вы просите случайных незнакомцев провести свое личное время, помогая вам. Никто не был невежлив с тобой! То, что вы называете ужасным снобизмом, не что иное, как констатация факта, пытающегося помочь вам избавиться от вашего заблуждения. Да ладно, на тебя никто не смотрел! Удачного кодирования!   -  person Shnugo    schedule 21.03.2018
comment
Вы правы, вы мне помогли. но я также был бы прав, если бы сказал, что ответы также покровительственные / снисходительные. Возможно, я слишком серьезно к себе отношусь.   -  person brumScouse    schedule 21.03.2018
comment
@brumScouse но я также был бы прав, если бы сказал, что ответы также покровительственные/снисходительные - Нет. Чего вы ожидаете? Вы просите о помощи, и кто-то, кто знает лучше, говорит вам, что не так. Рассказать вам о заблуждении — это не невежливо, не покровительственно и не снисходительно. Это просто указание на то место, где вы думали в неправильном направлении. Название вашего вопроса по-прежнему подтверждает этот факт. Возможно, вам следует просто проголосовать и принять, если это вам помогло, и закрыть этот вопрос. Удачного кодирования!   -  person Shnugo    schedule 21.03.2018
comment
Вижу, вас вчера троллили, и прошу прощения за это. Это был не я, и я не создавал себе другую учетную запись для этого. Тем не менее, часть ответа, но мой волшебный хрустальный шар вернулся после уборки и показал мне, покровительственно. Я должен согласиться не согласиться. Спасибо за уделенное время.   -  person brumScouse    schedule 22.03.2018
comment
@brumScouse, хорошо, что прояснил это, спасибо! Могу точно сказать, что это не означает покровительство. Просто посмотрите на этот поиск, который я использую довольно часто. Часто вопросы не очень ясны, как и ваши, и требуется некоторое интуитивное понимание (эмпатия, волшебные хрустальные шары), чтобы понять реальную проблему и дать соответствующий ответ. Было смешно, извините, если обиделся...   -  person Shnugo    schedule 23.03.2018
comment
@brumScouse, я отредактировал свой ответ ... Просто подсказка: без @Shnugo в вашем комментарии оповещение не сработает.   -  person Shnugo    schedule 23.03.2018


Ответы (1)


Ваш вопрос не очень ясен... Возможно, у вас неправильное представление о вашем i:type="AType". Это не пространство имен (чем бы ни было пользовательское пространство имен), а обычный атрибут с именем type, находящийся в вашем пространстве имен i, который объявлен в xmlns:i="blah".

Попробуй это

WITH XMLNAMESPACES ('http://www.w3.org/2001/XMLSchema-instance' as i
                   ,DEFAULT 'http://schemas.datacontract.org/2004/07/SomeCompany')
SELECT 'AType' AS [@i:type]
FOR XML PATH('BaseTransactionRequest');

Результатом является самозакрывающийся тег, объявляющий два пространства имен и содержащий ваш атрибут:

<BaseTransactionRequest xmlns="http://schemas.datacontract.org/2004/07/SomeCompany" 
                        xmlns:i="http://www.w3.org/2001/XMLSchema-instance" 
                        i:type="AType" />
person Shnugo    schedule 21.03.2018
comment
Привет, даунвотер, есть причина для твоего понижения? Я не люблю отрицательные голоса без комментария... Это - ммм - трусость... - person Shnugo; 21.03.2018