powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Парсинг хмл
13 сообщений из 13, страница 1 из 1
Парсинг хмл
    #39758407
kjt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kjt
Гость
Добрый день! Коллеги помогите решить задачку:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
<officialEmployees>
<k>LEADER</k>
<v>
<name>Иванов И.И.</name>
</v>
<k>ACCOUNTANT</k>
<v>
<name>Петров А.А.</name>
</v>
</officialEmployees>


Получал нужные мне поля name кодом:
Код: sql
1.
2.
3.
xml.value('(/r/officialEmployees/v/name)[1]','nvarchar(100)')
и
xml.value('(/r/officialEmployees/v/name)[2]','nvarchar(100)')



Пока не оказалось, что ПО к базе которого я обращаюсь может менять эти блоки местам, т.е. сначала может быть LEADER за ним ACCOUNTANT, в какой то момент наоборот.
Собственно вопрос как привязаться не к порядку поля V, а к полю K?

Получить что то типа
Код: sql
1.
xml.value('(/r/officialEmployees/k['LEADER']/v/name)[1]','nvarchar(100)')



Благодарен за любую помощь, подсказку!
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758411
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kjt, бить по голове тех, кто такую структуру хмль отдает предлагали?
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758415
kjt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kjt
Гость
buser,
Разработчик этого ПО довольно серьезная компания ))
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758418
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
declare @x xml = 
'<r>
<officialEmployees>
<k>LEADER</k>
<v>
<name>Иванов И.И.</name>
</v>
<k>ACCOUNTANT</k>
<v>
<name>Петров А.А.</name>
</v>
</officialEmployees>
</r>
'




select 
	ACCOUNTANT = 
		case 'ACCOUNTANT' 
			when emp_1_title then emp_1 		
			when emp_2_title then emp_2
		end
	, LEADER = 
		case 'LEADER' 
			when emp_1_title then emp_1 		
			when emp_2_title then emp_2
		end
from (
select 
	emp_1 = @x.value('(/r/officialEmployees/v/name)[1]','nvarchar(100)')
	, emp_1_title = @x.value('(/r/officialEmployees/k)[1]','nvarchar(100)')
	, emp_2 =  @x.value('(/r/officialEmployees/v/name)[2]','nvarchar(100)')
	, emp_2_title =  @x.value('(/r/officialEmployees/k)[2]','nvarchar(100)')
) a 
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758427
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kjtbuser,
Разработчик этого ПО довольно серьезная компания ))
Ну намекните им... что времена EDI ушли...
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758429
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758439
kjt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
kjt
Гость
msLex,

Спасибо!
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758476
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вариант
Код: sql
1.
2.
3.
4.
5.
select
 a.k, b.n
from
 (select t.n.value('.', 'varchar(30)'), row_number() over (order by t.n) from @x.nodes('/r/officialEmployees/k') t(n)) a(k, rn) join
 (select t.n.value('.', 'varchar(30)'), row_number() over (order by t.n) from @x.nodes('/r/officialEmployees/v/name') t(n)) b(n, rn) on b.rn = a.rn;
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758482
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
  n.c.value('(for $s in ../v where $s >> . return($s))[1]', 'nvarchar(1000)') 
from @xml.nodes('/officialEmployees/k[.="LEADER"]') as n(c)

select 
  n.c.value('(for $s in ../v where $s >> . return($s))[1]', 'nvarchar(1000)') 
from @xml.nodes('/officialEmployees/k[.="ACCOUNTANT"]') as n(c)
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758506
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и наши 5 копеек:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare
  @x xml=N'
<r>
  <officialEmployees>
    <k>LEADER</k>
    <v>
      <name>Иванов И.И.</name>
    </v>
    <k>ACCOUNTANT</k>
    <v>
      <name>Петров А.А.</name>
    </v>
  </officialEmployees>
</r>';
;with cte(position) as (
  select 'LEADER' union all select 'ACCOUNTANT'
)
select
  position, @x.value('(/r/officialEmployees/v[. >> (/r/officialEmployees/k[.=sql:column("position")])[1]]/name)[1]', 'varchar(100)')
from cte
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758507
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
работали б в MSSQL-ном XQuery xpath-оси following/following-sibling - было бы в разы проще
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758516
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловныи наши 5 копеек:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare
  @x xml=N'
<r>
  <officialEmployees>
    <k>LEADER</k>
    <v>
      <name>Иванов И.И.</name>
    </v>
    <k>ACCOUNTANT</k>
    <v>
      <name>Петров А.А.</name>
    </v>
  </officialEmployees>
</r>';
;with cte(position) as (
  select 'LEADER' union all select 'ACCOUNTANT'
)
select
  position, @x.value('(/r/officialEmployees/v[. >> (/r/officialEmployees/k[.=sql:column("position")])[1]]/name)[1]', 'varchar(100)')
from cte


Сон Веры Павловны , какое-нибудь вменяемое чтиво по этому делу можете посоветовать? В идеале - что-то типа М.Грабера. Понимание SQL.
...
Рейтинг: 0 / 0
Парсинг хмл
    #39758525
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster Сон Веры Павловны , какое-нибудь вменяемое чтиво по этому делу можете посоветовать? В идеале - что-то типа М.Грабера. Понимание SQL.
Увы - всё, что знаю, почерпнуто из статей MSDN по XQuery, и из тем данного раздела форума. Собранного в одном месте не видел нигде. Разве что могу порекомендовать самоучители по XQuery общего характера (т.е. без привязки к специфике MSSQL) - типа https://www.w3schools.com/xml/xquery_intro.asp
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Парсинг хмл
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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