Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 xml на ощупь. как убрать лишний xmlns ?  [new]
Liana2509
Member

Откуда:
Сообщений: 24
Здравствуйте!
Хочу написать выгрузку СЗВ-ТД в XML

Есть таблица:
rabotnik fam dolgnname osnov_date osnov_nomer osnov_date2 osnov_nomer2
42429 Иванов механик 10.01.20 125 11.01.20 126


Почитала про namespace, практически на ощупь составила такой синтаксис

declare @td xml, @vcodedoc int
select @vcodedoc = 1
;
WITH XMLNAMESPACES ('http://пф.рф/УТ/2017-08-21' AS УТ2,    
                    'http://пф.рф/АФ/2018-12-07' AS АФ5,  
                    DEFAULT 'https://schemas.microsoft.com')  
select @td =
( select 
       (select  '123' as 'УТ2:РегНомер',
                '456' as 'УТ2:ИНН',
                '789' as 'УТ2:КПП',
                'NGS' as 'НаименованиеОрганизации'
        for xml path('Работодатель'), type ) ,
   
  (select     (select  fam as 'УТ2:Фамилия',  
                       im as 'УТ2:Имя',
                       otch as 'УТ2:Отчество'                 
           from  vPdocmat_szvtd  z
           where z.rabotnik in (42429) and vcode = 5093 and pcode = @vcodedoc
           for xml  path('УТ2:ФИО'), type, ELEMENTS ),

        '123456' as 'УТ2:СНИЛС',

         (select '122JRT122' as 'UUID',
                 dolgnname as 'Должность',             
                 osnov_date as [Основание/Дата],
                 osnov_nomer as [Основание/Номер] 
            from  vPdocmat_szvtd  z
           where z.rabotnik in (42429) and vcode = 5093 and pcode = @vcodedoc    
           for xml path('Мероприятие'),  type,  elements)

     for xml path('ТрудоваяДеятельность'), type, elements)

  from Pdoc_szvtd d where vcode = @vcodedoc
for xml path('СЗВ-ТД'), root('ЭДПФР'), ELEMENTS XSINIL, type
)
select @td


получаю вот это:
<ЭДПФР xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://schemas.microsoft.com" xmlns:АФ5="http://пф.рф/АФ/2018-12-07" xmlns:УТ2="http://пф.рф/УТ/2017-08-21">
  <СЗВ-ТД>
    <Работодатель xmlns="https://schemas.microsoft.com" xmlns:АФ5="http://пф.рф/АФ/2018-12-07" xmlns:УТ2="http://пф.рф/УТ/2017-08-21">
      <УТ2:РегНомер>123</УТ2:РегНомер>
      <УТ2:ИНН>456</УТ2:ИНН>
      <УТ2:КПП>789</УТ2:КПП>
      <НаименованиеОрганизации>NGS</НаименованиеОрганизации>
    </Работодатель>
    <ТрудоваяДеятельность xmlns="https://schemas.microsoft.com" xmlns:АФ5="http://пф.рф/АФ/2018-12-07" xmlns:УТ2="http://пф.рф/УТ/2017-08-21">
      <УТ2:ФИО xmlns="https://schemas.microsoft.com" xmlns:АФ5="http://пф.рф/АФ/2018-12-07" xmlns:УТ2="http://пф.рф/УТ/2017-08-21">
        <УТ2:Фамилия>Шишкин</УТ2:Фамилия>
        <УТ2:Имя>Алексей</УТ2:Имя>
        <УТ2:Отчество>Николаевич</УТ2:Отчество>
      </УТ2:ФИО>
      <УТ2:СНИЛС>123456</УТ2:СНИЛС>
      <Мероприятие xmlns="https://schemas.microsoft.com" xmlns:АФ5="http://пф.рф/АФ/2018-12-07" xmlns:УТ2="http://пф.рф/УТ/2017-08-21">
        <UUID>122JRT122</UUID>
        <Должность>Дефектоскопист рентгено-гаммаграфирования</Должность>
        <Основание>
          <Дата>2018-10-05T00:00:00</Дата>
          <Номер>1285-к</Номер>
        </Основание>
      </Мероприятие>
    </ТрудоваяДеятельность>
  </СЗВ-ТД>
</ЭДПФР>


а хочу так
<ЭДПФР xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://schemas.microsoft.com" xmlns:АФ5="http://пф.рф/АФ/2018-12-07" xmlns:УТ2="http://пф.рф/УТ/2017-08-21">
  <СЗВ-ТД>
    <Работодатель>
      <УТ2:РегНомер>123</УТ2:РегНомер>
      <УТ2:ИНН>456</УТ2:ИНН>
      <УТ2:КПП>789</УТ2:КПП>
      <НаименованиеОрганизации>NGS</НаименованиеОрганизации>
    </Работодатель>
    <ТрудоваяДеятельность>
      <УТ2:ФИО>
        <УТ2:Фамилия>Шишкин</УТ2:Фамилия>
        <УТ2:Имя>Алексей</УТ2:Имя>
        <УТ2:Отчество>Николаевич</УТ2:Отчество>
      </УТ2:ФИО>
      <УТ2:СНИЛС>123456</УТ2:СНИЛС>
      <Мероприятие>
        <UUID>122JRT122</UUID>
        <Должность>Дефектоскопист рентгено-гаммаграфирования</Должность>
        <Основание>
          <Дата>2018-10-05T00:00:00</Дата>
          <Номер>1285-к</Номер>
        </Основание>
      </Мероприятие>
    </ТрудоваяДеятельность>
  </СЗВ-ТД>
</ЭДПФР>


я там два раза из одной и той же строки пишу select из таблицы, не придумала, как "одновременно" написать. Про Query почитала, но не смогла применить.
Подскажите, пожалуйста, как исправить синтаксис?
25 фев 20, 13:32    [22086489]     Ответить | Цитировать Сообщить модератору
 Re: xml на ощупь. как убрать лишний xmlns ?  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4534
Liana2509,
+
How to remove Namespaces from XML tags when using FOR XML option WITH XMLNAMESPACES
автор
Duplicate namespaces when creating nested XML is a known problem with FOR XML. There is an existing connect (Microsoft bug) for it, which you can vote for here:

http://connect.microsoft.com/SQLServer/feedback/details/265956/suppress-namespace-attributes-in-nested-select-for-xml-statements

Other options include:

ignore the duplicates. They don't do any harm apart from bloating the XML
use REPLACE to strip them out ( eg convert to NVARCHAR(MAX), replace the duplicates namespaces, cast back to XML )
build up the XML then add namespaces, eg
http://www.nesqlserv.com/blog/2009/09/removing-redundant-namespaces-from-for.html

use FOR XML EXPLICIT ( a lot more complicated, but is a workaround for preventing namespace duplication ), eg
http://social.msdn.microsoft.com/Forums/en/sqlxml/thread/9c26540c-3386-429a-aeff-d8bdc80e5801

write some custom CLR code to strip them ( a quick google shows numerous examples of this ) eg
http://blogs.msdn.com/b/vbteam/archive/2010/06/09/removing-duplicate-namespaces-in-xml-literals-shyam-namboodiripad.aspx
25 фев 20, 17:26    [22086714]     Ответить | Цитировать Сообщить модератору
 Re: xml на ощупь. как убрать лишний xmlns ?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
Liana2509,

если кратко: это достаточно трудоемко.
сериализатор xml в sql server при работе с пространствами имен в режиме path добавляет его на каждый дочерний узел.

как вариант не использовать for xml path с явными пространствами имен.


прочитайте вот это: там есть несколько workaround-ов

https://stackoverflow.com/questions/3242070/how-do-i-remove-redundant-namespace-in-nested-query-when-using-for-xml-path

сам пользовался вот таким решением, если не нужно дефолтный xmlns
select 
      'tcp' as [xmlns:xs],
      (select 1 as id, 'test' as [name] for xml path(''), type)
for xml raw('root'), type;


Сообщение было отредактировано: 25 фев 20, 17:53
25 фев 20, 17:50    [22086725]     Ответить | Цитировать Сообщить модератору
 Re: xml на ощупь. как убрать лишний xmlns ?  [new]
Liana2509
Member

Откуда:
Сообщений: 24
не сильно умно вышла из положения: написала выгрузку по тегам как мне нужно, не обращая внимания на все xlmns,

открыла файл в WordPad заменила строку с адресами на пустую строку. в первом (нужно варианте) вернула

готова доработать
23 мар 20, 09:07    [22104232]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить