powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / xml на ощупь. как убрать лишний xmlns ?
4 сообщений из 4, страница 1 из 1
xml на ощупь. как убрать лишний xmlns ?
    #39930583
Liana2509
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Хочу написать выгрузку СЗВ-ТД в XML

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

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
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



получаю вот это:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<ЭДПФР 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-к</Номер>
        </Основание>
      </Мероприятие>
    </ТрудоваяДеятельность>
  </СЗВ-ТД>
</ЭДПФР>



а хочу так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
<ЭДПФР 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 почитала, но не смогла применить.
Подскажите, пожалуйста, как исправить синтаксис?
...
Рейтинг: 0 / 0
xml на ощупь. как убрать лишний xmlns ?
    #39930710
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
xml на ощупь. как убрать лишний xmlns ?
    #39930718
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Код: sql
1.
2.
3.
4.
select 
      'tcp' as [xmlns:xs],
      (select 1 as id, 'test' as [name] for xml path(''), type)
for xml raw('root'), type;
...
Рейтинг: 0 / 0
xml на ощупь. как убрать лишний xmlns ?
    #39940154
Liana2509
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не сильно умно вышла из положения: написала выгрузку по тегам как мне нужно, не обращая внимания на все xlmns,

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

готова доработать
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / xml на ощупь. как убрать лишний xmlns ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]