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