Удалить 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 режим должен.

1 ответ

Решение

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

  1. укажите элемент AttributeName (третий элемент) в имени столбца. С точки зрения данных примера, это было бы 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.

Другие вопросы по тегам