Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию? / 14 сообщений из 14, страница 1 из 1
12.04.2019, 12:13
    #39800449
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
Здравствуйте, о гуру!
Подскажите советом, может кто сталкивался.
Не получается обратиться к атрибуту по названию, т.е. как
Код: sql
1.
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?

Вот весь код:

Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
 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 
...
Рейтинг: 0 / 0
12.04.2019, 12:20
    #39800455
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
-SWAN-,

вообще, как-то так
Код: sql
1.
select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').getAttribute("regionCode").value'

но форум для вопроса ты выбрал "метко" :)
...
Рейтинг: 0 / 0
12.04.2019, 12:30
    #39800468
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
court-SWAN-,

вообще, как-то так
Код: sql
1.
select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').getAttribute("regionCode").value'

но форум для вопроса ты выбрал "метко" :)

увы нет, так не работает((
...
Рейтинг: 0 / 0
12.04.2019, 13:58
    #39800552
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
Код: 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.
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;
...
Рейтинг: 0 / 0
12.04.2019, 14:17
    #39800573
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
invm, Спасибо большое! Выручили! Заработало)))))))))
Это новый для меня способ парсинга XML
...
Рейтинг: 0 / 0
12.04.2019, 17:12
    #39800677
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
invm,
А вот есть еще вопрос
XML здесь https://integration.cdek.ru/pvzlist/v1/xml

Сделал так
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
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;



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

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



Спасибо заранее за любую помощь!
...
Рейтинг: 0 / 0
12.04.2019, 17:21
    #39800682
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
-SWAN-,

Если PhoneDetail'ов несколько, какой number нужно получить?
...
Рейтинг: 0 / 0
12.04.2019, 17:33
    #39800688
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
invm-SWAN-,

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

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

Но если это сложно, то хотя бы только первый
...
Рейтинг: 0 / 0
12.04.2019, 18:02
    #39800706
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
-SWAN-желательно всё что есть в XML
Код: sql
1.
b.n.query('data(PhoneDetail/@number)').value('.', 'nvarchar(1000)')
...
Рейтинг: 0 / 0
13.04.2019, 06:03
    #39800834
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
Вопрос: нахера весь этот цирк, если можно загрузить и разобрать XML средствами MS SQL?
...
Рейтинг: 0 / 0
15.04.2019, 10:10
    #39801294
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
invm-SWAN-желательно всё что есть в XML
Код: sql
1.
b.n.query('data(PhoneDetail/@number)').value('.', 'nvarchar(1000)')



Спасибо большое за помощь! Всё получилось!)))
...
Рейтинг: 0 / 0
15.04.2019, 10:13
    #39801295
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
aleks222Вопрос: нахера весь этот цирк, если можно загрузить и разобрать XML средствами MS SQL?

А можно примерчик, или ссылку. Как это, загрузить и разобрать XML средствами MS SQL?
...
Рейтинг: 0 / 0
15.04.2019, 12:07
    #39801393
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
-SWAN-,

загляните в справочную документацию.
...
Рейтинг: 0 / 0
17.04.2019, 16:35
    #39802936
-SWAN-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
На всякий, я нашел как обратиться к атрибуту по названию (это ответ на изначальный вопрос):

Код: sql
1.
select @metod = 'documentElement.childNodes.item(' + cast(@i as varchar(10)) + ').attributes.getNamedItem("regionCode").Text'
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию? / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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