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

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 176
Здравствуйте, о гуру!
Подскажите советом, может кто сталкивался.
Не получается обратиться к атрибуту по названию, т.е. как
select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').attributes.item("regionCode").text'


По индексу получается. НО проблема в том, что кол-во атрибутов разное в строках
XML более 8000 символов, поэтому делаю через MSXML2.DOMDocument
Сам XML тут
https://integration.cdek.ru/v1/location/regions?

Вот весь код:

 set nocount on
 
declare
	@i        int,
	@count    int,
	@item     varchar(8000),
	@metod    varchar(128),
	@obj      int,
	@ret_val  int,
	@return   int,
	@text     varchar(8000),
	@url         varchar(512),

	@RegionCode as varchar(10),
	@RegionName as varchar(100),
	@FildName as varchar(50)  

declare @Regions table (
	regionName varchar(100),
	RegionCode varchar(10)  
   )

select @url ='https://integration.cdek.ru/v1/location/regions?'

select @i = 0
 
exec @return = sp_OACreate 'MSXML2.DOMDocument', @obj output
exec @return = sp_OASetProperty @obj, 'async', 0
exec @return = sp_OAMethod @obj, 'load', @ret_val output, @url
select @metod = 'documentElement.childNodes.length'
exec @return = sp_OAMethod @obj, @metod, @item output 
select @count = cast(@item as int) 

while @i < @count
begin
		--RegionName
		select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').attributes.item(0).text'	
		exec @return = sp_OAMethod @obj, @metod, @item output 
		select @RegionName = @item

		---RegionCode
		select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').attributes.item(1).name'	
		--!!!! select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').attributes.item("regionCode").text'	
		exec @return = sp_OAMethod @obj, @metod, @item output 
		select @FildName = @item
		
		if @FildName='regionCode' 
		begin
			select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').attributes.item(1).text'	
			exec @return = sp_OAMethod @obj, @metod, @item output 
			select @RegionCode = @item
		end
		else		select @RegionCode = ''


		insert into @Regions (RegionName, RegionCode) 
		select @RegionName, @RegionCode

		select @i = @i + 1
end

exec @return = sp_OADestroy @obj

select * from @Regions 
12 апр 19, 12:13    [21860372]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
court
Member

Откуда:
Сообщений: 1733
-SWAN-,

вообще, как-то так
select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').getAttribute("regionCode").value'
но форум для вопроса ты выбрал "метко" :)
12 апр 19, 12:20    [21860378]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
-SWAN-
Member

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 176
court
-SWAN-,

вообще, как-то так
select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').getAttribute("regionCode").value'
но форум для вопроса ты выбрал "метко" :)


увы нет, так не работает((
12 апр 19, 12:30    [21860397]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
invm
Member

Откуда: Москва
Сообщений: 8661
declare @t table (x xml);

declare @ret_val int, @result int, @obj int, @vResponseText varchar(8000), @url varchar(100) = 'https://integration.cdek.ru/v1/location/regions?';

exec @result = sp_OACreate 'MSXML2.DOMDocument', @obj output;
if @result <> 0
 exec sys.sp_OAGetErrorInfo @obj;

exec @result = sp_OASetProperty @obj, 'async', 0;
if @result <> 0
 exec sys.sp_OAGetErrorInfo @obj;

exec @result = sp_OAMethod @obj, 'load', @ret_val output, @url;
if @result <> 0
 exec sys.sp_OAGetErrorInfo @obj;

insert into @t
 exec @result = sp_OAGetProperty @obj, 'xml';
if @result <> 0
 exec sys.sp_OAGetErrorInfo @obj;

select
 b.n.value('@regionName', 'nvarchar(100)'),
 b.n.value('@regionCode', 'int')
from
 @t a cross apply
 a.x.nodes('/Regions/Region') b(n);

exec sys.sp_OADestroy @obj;
12 апр 19, 13:58    [21860534]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
-SWAN-
Member

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 176
invm, Спасибо большое! Выручили! Заработало)))))))))
Это новый для меня способ парсинга XML
12 апр 19, 14:17    [21860566]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
-SWAN-
Member

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 176
invm,
А вот есть еще вопрос
XML здесь https://integration.cdek.ru/pvzlist/v1/xml

Сделал так
declare @t table (x xml);

declare @ret_val int, @result int, @obj int, @vResponseText varchar(8000), @url varchar(100) = 'https://integration.cdek.ru/pvzlist/v1/xml';

exec @result = sp_OACreate 'MSXML2.DOMDocument', @obj output;
if @result <> 0
 exec sys.sp_OAGetErrorInfo @obj;

exec @result = sp_OASetProperty @obj, 'async', 0;
if @result <> 0
 exec sys.sp_OAGetErrorInfo @obj;

exec @result = sp_OAMethod @obj, 'load', @ret_val output, @url;
if @result <> 0
 exec sys.sp_OAGetErrorInfo @obj;

insert into @t
 exec @result = sp_OAGetProperty @obj, 'xml';
if @result <> 0
 exec sys.sp_OAGetErrorInfo @obj;

select
 b.n.value('@Code', 'nvarchar(10)') as Code,
 b.n.value('@PostalCode', 'nvarchar(10)') as PostalCode,
 b.n.value('@Name', 'nvarchar(100)') as Name,
 b.n.value('@CountryCode', 'nvarchar(10)') as CountryCode,
 b.n.value('@countryCodeIso', 'nvarchar(10)') as countryCodeIso,
 b.n.value('@CountryName', 'nvarchar(100)') as CountryName,
 b.n.value('@RegionCode', 'nvarchar(10)') as RegionCode,
 b.n.value('@RegionName', 'nvarchar(100)') as RegionName,
 b.n.value('@CityCode', 'nvarchar(10)') as CityCode,
 b.n.value('@City', 'nvarchar(100)') as City,
 b.n.value('@WorkTime', 'nvarchar(100)') as WorkTime,
 b.n.value('@Address', 'nvarchar(200)') as Address,
 b.n.value('@FullAddress', 'nvarchar(200)') as FullAddress,
 b.n.value('@AddressComment', 'nvarchar(300)') as AddressComment,
 b.n.value('@Phone', 'nvarchar(100)') as Phone,
 b.n.value('@Email', 'nvarchar(100)') as Email,
 b.n.value('@qqId', 'nvarchar(10)') as qqId,
 b.n.value('@Note', 'nvarchar(100)') as Note,
 b.n.value('@coordX', 'nvarchar(20)') as coordX,
 b.n.value('@coordY', 'nvarchar(20)') as coordY,
 b.n.value('@Type', 'nvarchar(10)') as Type,
 b.n.value('@ownerCode', 'nvarchar(10)') as ownerCode,
 b.n.value('@IsDressingRoom', 'nvarchar(10)') as IsDressingRoom,
 b.n.value('@HaveCashless', 'nvarchar(10)') as HaveCashless,
 b.n.value('@AllowedCod', 'nvarchar(10)') as AllowedCod,
 b.n.value('@NearestStation', 'nvarchar(200)') as NearestStation,
 b.n.value('@MetroStation', 'nvarchar(100)') as MetroStation,
 b.n.value('@Site', 'nvarchar(100)') as Site 
  
  
from
 @t a cross apply
 a.x.nodes('/PvzList/Pvz') b(n)

exec sys.sp_OADestroy @obj;


а как мне вытянуть данные в этом же (в одном, желательно сделать именно одним запросом) запросе ещё и из нижнего уровня?
т.е подцепить вот такую конструкцию
 select
 b.n.value('@number', 'nvarchar(100)') as number 

from
 @t a cross apply
 a.x.nodes('/PvzList/Pvz/PhoneDetail') b(n)


Спасибо заранее за любую помощь!
12 апр 19, 17:12    [21860719]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
invm
Member

Откуда: Москва
Сообщений: 8661
-SWAN-,

Если PhoneDetail'ов несколько, какой number нужно получить?
12 апр 19, 17:21    [21860724]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
-SWAN-
Member

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 176
invm
-SWAN-,

Если PhoneDetail'ов несколько, какой number нужно получить?


желательно всё что есть в XML, если есть хоть 3 номера то вывести их всех в 3-х столбцах.

Но если это сложно, то хотя бы только первый
12 апр 19, 17:33    [21860736]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
invm
Member

Откуда: Москва
Сообщений: 8661
-SWAN-
желательно всё что есть в XML
b.n.query('data(PhoneDetail/@number)').value('.', 'nvarchar(1000)')
12 апр 19, 18:02    [21860764]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
aleks222
Member

Откуда:
Сообщений: 693
Вопрос: нахера весь этот цирк, если можно загрузить и разобрать XML средствами MS SQL?
13 апр 19, 06:03    [21861004]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
-SWAN-
Member

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 176
invm
-SWAN-
желательно всё что есть в XML
b.n.query('data(PhoneDetail/@number)').value('.', 'nvarchar(1000)')


Спасибо большое за помощь! Всё получилось!)))
15 апр 19, 10:10    [21862018]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
-SWAN-
Member

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 176
aleks222
Вопрос: нахера весь этот цирк, если можно загрузить и разобрать XML средствами MS SQL?


А можно примерчик, или ссылку. Как это, загрузить и разобрать XML средствами MS SQL?
15 апр 19, 10:13    [21862022]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6532
-SWAN-,

загляните в справочную документацию.
15 апр 19, 12:07    [21862240]     Ответить | Цитировать Сообщить модератору
 Re: MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?  [new]
-SWAN-
Member

Откуда: Оделся, обулся - и на работу вернулся!)
Сообщений: 176
На всякий, я нашел как обратиться к атрибуту по названию (это ответ на изначальный вопрос):

select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').attributes.getNamedItem("regionCode").Text'
17 апр 19, 16:35    [21865293]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить