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

Откуда:
Сообщений: 28
Уважаемые форумчане,
подскажите, пож, способ получения полных адресов/путей каждого элемента произвольного XML.
кажется, что это довольно часто встречающаяся задача, м.б. есть какие-то стандартные ф-ции?

например такой XML:

+
<purchaseObject xmlns="http://mysite.ru/1">
  <OKPD>
    <code>40.30.10.161</code>
    <name>Услуги по распределению пара и горячей воды (тепловой энергии) населению для отопления (услуги центрального отопления)</name>
  </OKPD>
  <name>Коммунальные услуги (отопление)</name>
  <OKEI>
    <code>876</code>
    <nationalCode>УСЛ ЕД</nationalCode>
  </OKEI>
  <price>1305835.2</price>
  <quantity>
    <value>1.0</value>
  </quantity>
  <sum>1305835.2</sum>
</purchaseObject>


хотелось бы получить что-то типа такого:
//purchaseObject/OKPD/code
//purchaseObject/OKPD/name
etc.

заранее спасибо! :о)
4 апр 15, 16:04    [17473545]     Ответить | Цитировать Сообщить модератору
 Re: полный путь каждого элемента произвольного XML  [new]
ЦБ
Member [заблокирован]

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

так например
declare @xml xml
set @xml='<purchaseObject xmlns="http://mysite.ru/1">
  <OKPD>
    <code>40.30.10.161</code>
    <name>Услуги по распределению пара и горячей воды (тепловой энергии) населению для отопления (услуги центрального отопления)</name>
  </OKPD>
  <name>Коммунальные услуги (отопление)</name>
  <OKEI>
    <code>876</code>
    <nationalCode>УСЛ ЕД</nationalCode>
  </OKEI>
  <price>1305835.2</price>
  <quantity>
    <value>1.0</value>
  </quantity>
  <sum>1305835.2</sum>
</purchaseObject>'

declare
	@hd int;

exec sp_xml_preparedocument @hd output, @xml

--select * from openxml(@hd, '.', 1)

;with t as
	(select * from openxml(@hd, '.', 1)),

a as 
	(
	select id, '/'+localname as path from t where parentid is null

	union all

	select t.id, a.path+'/'+case when t.nodetype=2 then '@' else '' end+t.localname
	from a inner join t on a.id=t.parentid
	where t.nodetype in (1,2)
	)		

select * from a order by id

exec sp_xml_removedocument @hd;

id                   path
-------------------- -----------------------------------------------------------------------
0                    /purchaseObject
2                    /purchaseObject/@xmlns
3                    /purchaseObject/OKPD
4                    /purchaseObject/OKPD/code
5                    /purchaseObject/OKPD/name
6                    /purchaseObject/name
7                    /purchaseObject/OKEI
8                    /purchaseObject/OKEI/code
9                    /purchaseObject/OKEI/nationalCode
10                   /purchaseObject/price
11                   /purchaseObject/quantity
12                   /purchaseObject/quantity/value
13                   /purchaseObject/sum
4 апр 15, 16:25    [17473602]     Ответить | Цитировать Сообщить модератору
 Re: полный путь каждого элемента произвольного XML  [new]
Alex-65
Member

Откуда:
Сообщений: 28
ЦБ, Спасибо!
4 апр 15, 16:37    [17473630]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить