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

Откуда:
Сообщений: 28
Уважаемые форумчане,
научите как разобрать вот такой XML:

+
<ns2:export xmlns="http://zakupki.gov.ru/oos/types/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1">
  <ns2:fcsNotificationEF schemeVersion="1.0">
    <procedureInfo>
      <collecting>
        <startDate>2014-01-28T00:00:00+04:00</startDate>
        <place>В соответствии со ст. 66, Федеральный закон от 05.04.2013 N 44-ФЗ и подразделом 4 Аукционной документации</place>
        <order>В соответствии со ст. 66, Федеральный закон от 05.04.2013 N 44-ФЗ и подразделом 4 Аукционной документации</order>
        <endDate>2014-02-04T07:00:00+04:00</endDate>
      </collecting>
      <scoring>
        <date>2014-02-04T00:00:00+04:00</date>
      </scoring>
      <bidding>
        <date>2014-02-07T00:00:00+04:00</date>
        <addInfo>см. Аукционную документацию</addInfo>
      </bidding>
    </procedureInfo>
    <lot>
      <purchaseObjects>
        <purchaseObject>
          <OKPD>
            <code>51.82.10.120</code>
            <name>Услуги по оптовой торговле машинами и оборудованием для строительства</name>
          </OKPD>
          <name>Колесный трактор</name>
          <OKEI>
            <code>796</code>
            <nationalCode>ШТ</nationalCode>
          </OKEI>
          <price>660000</price>
          <quantity>
            <value>1.0</value>
          </quantity>
          <sum>660000</sum>
        </purchaseObject>
        <purchaseObject>
          <OKPD>
            <code>51.82.10.120</code>
            <name>Услуги по оптовой торговле машинами и оборудованием для строительства</name>
          </OKPD>
          <name>Прицеп цистерна
(поливомоечное оборудование)
</name>
          <OKEI>
            <code>796</code>
            <nationalCode>ШТ</nationalCode>
          </OKEI>
          <price>275000</price>
          <quantity>
            <value>1.0</value>
          </quantity>
          <sum>275000</sum>
        </purchaseObject>
        <totalSum>935000</totalSum>
      </purchaseObjects>
    </lot>
  </ns2:fcsNotificationEF>
</ns2:export>


надо получить несколько записей в полях "purchaseObject/OKPD/code", "purchaseObject/OKPD/name", "purchaseObject/price" что-то типа:

CODE NAME PRICE
-----------------------------------------------------------------------------------------------------
51.82.10.120 Услуги по оптовой торговле машинами и оборудованием для строительства 660000
51.82.10.120 Услуги по оптовой торговле машинами и оборудованием для строительства 275000
30 мар 15, 23:24    [17452348]     Ответить | Цитировать Сообщить модератору
 Re: научите как разобрать XML  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Alex-65,

+ портянка
declare
	@d xml =
'
	<ns2:export xmlns="http://zakupki.gov.ru/oos/types/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1">
	  <ns2:fcsNotificationEF schemeVersion="1.0">
		<procedureInfo>
		  <collecting>
			<startDate>2014-01-28T00:00:00+04:00</startDate>
			<place>В соответствии со ст. 66, Федеральный закон от 05.04.2013 N 44-ФЗ и подразделом 4 Аукционной документации</place>
			<order>В соответствии со ст. 66, Федеральный закон от 05.04.2013 N 44-ФЗ и подразделом 4 Аукционной документации</order>
			<endDate>2014-02-04T07:00:00+04:00</endDate>
		  </collecting>
		  <scoring>
			<date>2014-02-04T00:00:00+04:00</date>
		  </scoring>
		  <bidding>
			<date>2014-02-07T00:00:00+04:00</date>
			<addInfo>см. Аукционную документацию</addInfo>
		  </bidding>
		</procedureInfo>
		<lot>
		  <purchaseObjects>
			<purchaseObject>
			  <OKPD>
				<code>51.82.10.120</code>
				<name>Услуги по оптовой торговле машинами и оборудованием для строительства</name>
			  </OKPD>
			  <name>Колесный трактор</name>
			  <OKEI>
				<code>796</code>
				<nationalCode>ШТ</nationalCode>
			  </OKEI>
			  <price>660000</price>
			  <quantity>
				<value>1.0</value>
			  </quantity>
			  <sum>660000</sum>
			</purchaseObject>
			<purchaseObject>
			  <OKPD>
				<code>51.82.10.120</code>
				<name>Услуги по оптовой торговле машинами и оборудованием для строительства</name>
			  </OKPD>
			  <name>Прицеп цистерна
	(поливомоечное оборудование)
	</name>
			  <OKEI>
				<code>796</code>
				<nationalCode>ШТ</nationalCode>
			  </OKEI>
			  <price>275000</price>
			  <quantity>
				<value>1.0</value>
			  </quantity>
			  <sum>275000</sum>
			</purchaseObject>
			<totalSum>935000</totalSum>
		  </purchaseObjects>
		</lot>
	  </ns2:fcsNotificationEF>
	</ns2:export>
';

declare
	@hd int;

exec sp_xml_preparedocument @hd output, @d, '<root xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns:ns1="http://zakupki.gov.ru/oos/types/1" />'

select t.*
from
	openxml(@hd, N'/ns2:export/ns2:fcsNotificationEF/ns1:lot/ns1:purchaseObjects/ns1:purchaseObject', 1)
	with
	(
		code	varchar(100)	'./ns1:OKPD/ns1:code',
		name	nvarchar(max)	'./ns1:OKPD/ns1:name',
		price	decimal			'./ns1:price'
	) t;

exec sp_xml_removedocument @hd;


declare
	@hd int;

exec sp_xml_preparedocument @hd output, @d, '<root xmlns:ns2="http://zakupki.gov.ru/oos/export/1" xmlns:ns1="http://zakupki.gov.ru/oos/types/1" />'

select t.*
from
	openxml(@hd, N'/ns2:export/ns2:fcsNotificationEF/ns1:lot/ns1:purchaseObjects/ns1:purchaseObject', 1)
	with
	(
		code	varchar(100)	'./ns1:OKPD/ns1:code',
		name	nvarchar(max)	'./ns1:OKPD/ns1:name',
		price	decimal		'./ns1:price'
	) t;

exec sp_xml_removedocument @hd;
30 мар 15, 23:47    [17452402]     Ответить | Цитировать Сообщить модератору
 Re: научите как разобрать XML  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
+

можно было и query/nodes/value, но если XML большой, то будет очередная тема

ps. если xml > 2Gb, то SQLXML Bulk Load
30 мар 15, 23:52    [17452411]     Ответить | Цитировать Сообщить модератору
 Re: научите как разобрать XML  [new]
Alex-65
Member

Откуда:
Сообщений: 28
churupaha,
а без sp_xml_preparedocument никак нельзя?
30 мар 15, 23:59    [17452427]     Ответить | Цитировать Сообщить модератору
 Re: научите как разобрать XML  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Alex-65,

можно, ссылки вверху
31 мар 15, 00:02    [17452433]     Ответить | Цитировать Сообщить модератору
 Re: научите как разобрать XML  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1908
churupaha
Alex-65,

можно, ссылки вверху


+ для особо ленивых

declare @x xml
set @x = '<ns2:export xmlns="http://zakupki.gov.ru/oos/types/1" xmlns:ns2="http://zakupki.gov.ru/oos/export/1">
  <ns2:fcsNotificationEF schemeVersion="1.0">
    <procedureInfo>
      <collecting>
        <startDate>2014-01-28T00:00:00+04:00</startDate>
        <place>В соответствии со ст. 66, Федеральный закон от 05.04.2013 N 44-ФЗ и подразделом 4 Аукционной документации</place>
        <order>В соответствии со ст. 66, Федеральный закон от 05.04.2013 N 44-ФЗ и подразделом 4 Аукционной документации</order>
        <endDate>2014-02-04T07:00:00+04:00</endDate>
      </collecting>
      <scoring>
        <date>2014-02-04T00:00:00+04:00</date>
      </scoring>
      <bidding>
        <date>2014-02-07T00:00:00+04:00</date>
        <addInfo>см. Аукционную документацию</addInfo>
      </bidding>
    </procedureInfo>
    <lot>
      <purchaseObjects>
        <purchaseObject>
          <OKPD>
            <code>51.82.10.120</code>
            <name>Услуги по оптовой торговле машинами и оборудованием для строительства</name>
          </OKPD>
          <name>Колесный трактор</name>
          <OKEI>
            <code>796</code>
            <nationalCode>ШТ</nationalCode>
          </OKEI>
          <price>660000</price>
          <quantity>
            <value>1.0</value>
          </quantity>
          <sum>660000</sum>
        </purchaseObject>
        <purchaseObject>
          <OKPD>
            <code>51.82.10.120</code>
            <name>Услуги по оптовой торговле машинами и оборудованием для строительства</name>
          </OKPD>
          <name>Прицеп цистерна
(поливомоечное оборудование)
</name>
          <OKEI>
            <code>796</code>
            <nationalCode>ШТ</nationalCode>
          </OKEI>
          <price>275000</price>
          <quantity>
            <value>1.0</value>
          </quantity>
          <sum>275000</sum>
        </purchaseObject>
        <totalSum>935000</totalSum>
      </purchaseObjects>
    </lot>
  </ns2:fcsNotificationEF>
</ns2:export>'

;with xmlnamespaces ('http://zakupki.gov.ru/oos/export/1' as ns2,
                     default 'http://zakupki.gov.ru/oos/types/1')

select
      C.query('.').value('(/purchaseObject/OKPD/code/text())[1]', 'VARCHAR(255)') as CODE,
      C.query('.').value('(/purchaseObject/OKPD/name/text())[1]', 'VARCHAR(255)') as Name,
      C.query('.').value('(/purchaseObject/price/text())[1]', 'MONEY') as Price
from @x.nodes('/ns2:export/ns2:fcsNotificationEF/lot/purchaseObjects/purchaseObject') as T(C)

31 мар 15, 00:11    [17452457]     Ответить | Цитировать Сообщить модератору
 Re: научите как разобрать XML  [new]
Alex-65
Member

Откуда:
Сообщений: 28
churupaha,
Спасибо!
31 мар 15, 00:23    [17452471]     Ответить | Цитировать Сообщить модератору
 Re: научите как разобрать XML  [new]
Alex-65
Member

Откуда:
Сообщений: 28
felix_ff,
Коллега Felix - отдельный поклон!
31 мар 15, 00:24    [17452473]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить