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

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

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

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

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

увы нет, так не работает((
...
Рейтинг: 0 / 0
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
    #39800552
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
    #39800573
-SWAN-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, Спасибо большое! Выручили! Заработало)))))))))
Это новый для меня способ парсинга XML
...
Рейтинг: 0 / 0
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
    #39800677
-SWAN-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
MSXML2.DOMDocument - как обратиться к атрибуту не по индексу, а по названию?
    #39800682
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-SWAN-,

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

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

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

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



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

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

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

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


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