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

Откуда: Киев
Сообщений: 434
Пожалуйста, подскажите, как оптимально считать в таблицу t с полями KOSAR, WAERS, KTEXT, LTEXT следующую xml:
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <E1CSKSM>
    <KOSAR>T_KOSAR</KOSAR>
    <WAERS>T_WAERS</WAERS>
    <E1CSKTM>
      <KTEXT>Общее название</KTEXT>
      <LTEXT>Описание</LTEXT>
    </E1CSKTM>
  </E1CSKSM>
  <E1CSKSM>
    <KOSAR>KOSAR2</KOSAR>
    <WAERS>валюта2</WAERS>
    <E1CSKTM />
  </E1CSKSM>
</Root>

И как лучше убрать из данной xml-ки текст в самом элементе Root (xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"), чтоб залогировать эту структуру "без мусора"?
17 сен 12, 13:41    [13175624]     Ответить | Цитировать Сообщить модератору
 Re: парсинг XML в переменные  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
declare
	@xmldata		xml
	
;

set @xmldata = '
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <E1CSKSM>
    <KOSAR>T_KOSAR</KOSAR>
    <WAERS>T_WAERS</WAERS>
    <E1CSKTM>
      <KTEXT>Общее название</KTEXT>
      <LTEXT>Описание</LTEXT>
    </E1CSKTM>
  </E1CSKSM>
  <E1CSKSM>
    <KOSAR>KOSAR2</KOSAR>
    <WAERS>валюта2</WAERS>
    <E1CSKTM />
  </E1CSKSM>
</Root>
';

select
	t1.c1.value('.','varchar(max)')	as [kosar],
	t2.c2.value('.','varchar(max)')	as [waers],
	t3.c3.value('.','varchar(max)')	as [ktext],
	t4.c4.value('.','varchar(max)')	as [ltext]
from @xmldata.nodes('//E1CSKSM') as t(c)
outer apply t.c.nodes('KOSAR')	as t1(c1)
outer apply t.c.nodes('WAERS')	as t2(c2)
outer apply t.c.nodes('E1CSKTM/KTEXT')	as t3(c3)
outer apply t.c.nodes('E1CSKTM/LTEXT')	as t4(c4);
17 сен 12, 14:36    [13176060]     Ответить | Цитировать Сообщить модератору
 Re: парсинг XML в переменные  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
Leax,
namespace = "мусор"? Любопытно... )
17 сен 12, 14:37    [13176079]     Ответить | Цитировать Сообщить модератору
 Re: парсинг XML в переменные  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
thrashead
+

declare
	@xmldata		xml
	
;

set @xmldata = '
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <E1CSKSM>
    <KOSAR>T_KOSAR</KOSAR>
    <WAERS>T_WAERS</WAERS>
    <E1CSKTM>
      <KTEXT>Общее название</KTEXT>
      <LTEXT>Описание</LTEXT>
    </E1CSKTM>
  </E1CSKSM>
  <E1CSKSM>
    <KOSAR>KOSAR2</KOSAR>
    <WAERS>валюта2</WAERS>
    <E1CSKTM />
  </E1CSKSM>
</Root>
';

select
	t1.c1.value('.','varchar(max)')	as [kosar],
	t2.c2.value('.','varchar(max)')	as [waers],
	t3.c3.value('.','varchar(max)')	as [ktext],
	t4.c4.value('.','varchar(max)')	as [ltext]
from @xmldata.nodes('//E1CSKSM') as t(c)
outer apply t.c.nodes('KOSAR')	as t1(c1)
outer apply t.c.nodes('WAERS')	as t2(c2)
outer apply t.c.nodes('E1CSKTM/KTEXT')	as t3(c3)
outer apply t.c.nodes('E1CSKTM/LTEXT')	as t4(c4);

жестЪ
select  x.x.value('(KOSAR/text())[1]', 'varchar(150)') as KOSAR
      , x.x.value('(WAERS/text())[1]', 'varchar(150)') as WAERS
      , x.x.value('(E1CSKTM/KTEXT/text())[1]', 'varchar(150)') as KTEXT
      , x.x.value('(E1CSKTM/LTEXT/text())[1]', 'varchar(150)') as LTEXT      
from    @xml.nodes('/Root/E1CSKSM') x ( x )
17 сен 12, 14:40    [13176097]     Ответить | Цитировать Сообщить модератору
 Re: парсинг XML в переменные  [new]
thrashead
Member

Откуда: Россия, Санкт-Петербург
Сообщений: 722
denis2710,
Откуда такая уверенность в структуре xml? ))
А если вложенные узлы?

<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <E1CSKSM>
    <KOSAR>T_KOSAR</KOSAR>
    <WAERS>T_WAERS</WAERS>
    <E1CSKTM>
      <KTEXT>Общее название</KTEXT>
      <LTEXT>Описание</LTEXT>
    </E1CSKTM>
  </E1CSKSM>
  <E1CSKSM>
    <KOSAR>KOSAR2</KOSAR>
    <WAERS>валюта2</WAERS>
    <E1CSKTM />
    <E1CSKSM>
			<KOSAR>KOSAR3</KOSAR>
			<WAERS>валюта3</WAERS>
			<E1CSKTM />
		</E1CSKSM>
  </E1CSKSM>
</Root>
17 сен 12, 15:01    [13176357]     Ответить | Цитировать Сообщить модератору
 Re: парсинг XML в переменные  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Хорошо что вы не знаете что это за файл и и почему TC его парсит на скуле и не представляете реальную архитектуру системы.
17 сен 12, 15:15    [13176500]     Ответить | Цитировать Сообщить модератору
 Re: парсинг XML в переменные  [new]
Jovanny
Member

Откуда:
Сообщений: 1195
Можно и так.

DECLARE @idoc int;
EXEC sp_xml_preparedocument @idoc OUTPUT, @xmldata

SELECT    *
FROM       OPENXML (@idoc, '/Root//E1CSKSM',2)
            WITH (KOSAR varchar(150),
                  WAERS varchar(150),
				  KTEXT varchar(150) './E1CSKTM',
				  LTEXT varchar(150) './E1CSKTM')

EXEC sp_xml_removedocument @idoc
17 сен 12, 15:16    [13176521]     Ответить | Цитировать Сообщить модератору
 Re: парсинг XML в переменные  [new]
Leax
Member

Откуда: Киев
Сообщений: 434
Большое спасибо!

У thrasheadи denis2710 - правильные варианты, у denis2710 - оптимальный для использования :)
Jovanny, спасибо за вариант, но неправильно отобрались KTEXT и LTEXT (слепились вместе).

thrashead
для хранения эти данные совершенно излишни в моем случае
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
17 сен 12, 15:29    [13176653]     Ответить | Цитировать Сообщить модератору
 Re: парсинг XML в переменные  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
thrashead,
thrashead
Откуда такая уверенность в структуре xml? ))
А если вложенные узлы?

К сожалению,способность читать мысли на расстоянии у меня еще плохо развита
Но, все равно ваш скрипт жестЪ
+ посмотрите планы выполнения

declare @xml xml = '<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <E1CSKSM>
    <KOSAR>T_KOSAR</KOSAR>
    <WAERS>T_WAERS</WAERS>
    <E1CSKTM>
      <KTEXT>Общее название</KTEXT>
      <LTEXT>Описание</LTEXT>
    </E1CSKTM>
  </E1CSKSM>
  <E1CSKSM>
    <KOSAR>KOSAR2</KOSAR>
    <WAERS>валюта2</WAERS>
    <E1CSKTM />
    <E1CSKSM>
			<KOSAR>KOSAR3</KOSAR>
			<WAERS>валюта3</WAERS>
			<E1CSKTM />
		</E1CSKSM>
  </E1CSKSM>
</Root>'

select  x.x.value('(KOSAR/text())[1]', 'varchar(150)') as KOSAR
      , x.x.value('(WAERS/text())[1]', 'varchar(150)') as WAERS
      , x.x.value('(E1CSKTM/KTEXT/text())[1]', 'varchar(150)') as KTEXT
      , x.x.value('(E1CSKTM/LTEXT/text())[1]', 'varchar(150)') as LTEXT      
from    @xml.nodes('//E1CSKSM') x ( x )


select
	t1.c1.value('.','varchar(max)')	as [kosar],
	t2.c2.value('.','varchar(max)')	as [waers],
	t3.c3.value('.','varchar(max)')	as [ktext],
	t4.c4.value('.','varchar(max)')	as [ltext]
from @xml.nodes('//E1CSKSM') as t(c)
outer apply t.c.nodes('KOSAR')	as t1(c1)
outer apply t.c.nodes('WAERS')	as t2(c2)
outer apply t.c.nodes('E1CSKTM/KTEXT')	as t3(c3)
outer apply t.c.nodes('E1CSKTM/LTEXT')	as t4(c4);

17 сен 12, 15:34    [13176705]     Ответить | Цитировать Сообщить модератору
 Re: парсинг XML в переменные  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Leax
для хранения эти данные совершенно излишни в моем случае
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
Это проблемы того кто генерирует данный XML. Зачем их излишне генерировать чтоб потом мучится их вырезать?!
17 сен 12, 15:56    [13176920]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить