Страницы

Поиск по вопросам

вторник, 9 июля 2019 г.

Добавить namespace'ы в XML-блоки

Здравствуйте! Имеется следующий тэмплэйт:
randomInfo randomInfo randomInfo randomInfo randomInfo randomInfo
Как, используя T-SQL превратить его в:
randomInfo randomInfo randomInfo randomInfo randomInfo randomInfo
PersonalProgramList - корень, PersonalProgram - неограниченное кол-во.


Ответ

Простой способ заменить namespace элемента (средствами XQuery) мне неизвестен.
Если бы исходная схема XML была именно такая как в вопросе (внутри PersonalProgram могут быть только One и Two с каким-то текстом внутри), то можно было бы честно пересобрать исходный XML в нужном формате с помощью FLWOR
declare @xml xml = N'...';
select @xml.query(N' { for $pp in /PersonalProgramList/PersonalProgram return { for $a in $pp/* return if (local-name($a) = "One") then {$a/text()} else {$a/text()} } } ');
Если же внутри PersonalProgram может быть что угодно, то можно так же с помощью FLWOR пересобрать XML, указав нужный namespace для PersonalProgram, и скопировав всё что внутри. Однако при замене namespace для PersonalProgram у всего что внутри явно укажется xmlns="", который кроме как с помощью REPLACE я не вижу варианта убрать (поэтому мне этот способ не очень нравится):
select cast(replace(cast(@xml.query(N' { for $pp in /PersonalProgramList/PersonalProgram return { $pp/* } } ') as nvarchar(max)), N'xmlns=""', N'') as xml);

Комментариев нет:

Отправить комментарий