Удалить объявление пространства имен xmlns= при использовании FOR XML EXPLICIT

Я создаю XML-документ, используя FOR XML EXPLICIT:

declare @MyTable table (value xml);

insert into @MyTable values
 ('<foo bar="data1">content1</foo>')
,('<foo bar="data2">content2</foo>')
,('<foo bar="data3">content3</foo>');

select 1 as Tag, null as Parent
    , value as [x!1!!xml]
from @MyTable
for xml explicit;

И получить такой ответ:

<x>
  <foo bar="data1" xmlns="">content1</foo>
</x>
<x>
  <foo bar="data2" xmlns="">content2</foo>
</x>
<x>
  <foo bar="data3" xmlns="">content3</foo>
</x>

Проблема в том, что мне не нужен атрибут xmlns.

Я нашел решение, но оно кажется кладжом.

select 1 as Tag, null as Parent
    , cast (value as varchar(200)) as [x!1!!xml]
from @MyTable
for xml explicit;

Есть ли более элегантный способ решить проблему?

Не предлагать использовать FOR XML PATH/RAW/AUTO.

Режим EXPLICIT обязателен.


person GriGrim    schedule 25.12.2015    source источник
comment
Можете ли вы объяснить это ограничение? Режим EXPLICIT является обязательным и не предлагать использование FOR XML PATH/RAW/AUTO   -  person Pரதீப்    schedule 25.12.2015
comment
Гораздо проще преобразовать иерархические данные в xml, используя режим EXPLICIT. И в качестве эксперимента тоже.   -  person GriGrim    schedule 25.12.2015


Ответы (1)


Если имя корневого элемента (например, foo в примере данных в Вопросе) одинаково во всех строках, то для этого существует простой способ:

  1. укажите элемент AttributeName (3-й элемент) в имени столбца. С точки зрения данных примера это будет foo.

  2. используйте xmltext Директиву (4-й пункт) вместо xml.

Имя столбца будет:

[x!1!foo!xmltext]

И полный запрос будет:

SELECT 1 AS [Tag], NULL AS [Parent]
    , value AS [x!1!foo!xmltext]
FROM @MyTable
FOR XML EXPLICIT;

Но если имя корневого элемента меняется, то описанный выше метод не подходит, и кажется, что единственный способ — преобразовать данные XML в NVARCHAR (лучший выбор, чем VARCHAR, поскольку XML и NVARCHAR оба являются UTF-16):

SELECT 1 AS [Tag], NULL AS [Parent]
    , CONVERT(NVARCHAR(MAX), value) AS [x!1!!xml]
FROM @MyTable
FOR XML EXPLICIT;

Для получения дополнительной информации см. страницу MSDN для Использование режима EXPLICIT с FOR XML< /а>.

person Solomon Rutzky    schedule 26.12.2015
comment
Большой! Корневой элемент не меняется. Xmltext решил проблему. Спасибо. - person GriGrim; 26.12.2015