Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Парсинг хмл / 13 сообщений из 13, страница 1 из 1
11.01.2019, 13:10
    #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
11.01.2019, 13:13
    #39758411
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг хмл
kjt, бить по голове тех, кто такую структуру хмль отдает предлагали?
...
Рейтинг: 0 / 0
11.01.2019, 13:16
    #39758415
kjt
kjt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг хмл
buser,
Разработчик этого ПО довольно серьезная компания ))
...
Рейтинг: 0 / 0
11.01.2019, 13:20
    #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
11.01.2019, 13:34
    #39758427
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг хмл
kjtbuser,
Разработчик этого ПО довольно серьезная компания ))
Ну намекните им... что времена EDI ушли...
...
Рейтинг: 0 / 0
11.01.2019, 13:35
    #39758429
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг хмл
...
Рейтинг: 0 / 0
11.01.2019, 13:51
    #39758439
kjt
kjt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг хмл
msLex,

Спасибо!
...
Рейтинг: 0 / 0
11.01.2019, 14:57
    #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
11.01.2019, 15:09
    #39758482
daw
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
11.01.2019, 15:41
    #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
11.01.2019, 15:42
    #39758507
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг хмл
работали б в MSSQL-ном XQuery xpath-оси following/following-sibling - было бы в разы проще
...
Рейтинг: 0 / 0
11.01.2019, 16:02
    #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
11.01.2019, 16:25
    #39758525
Сон Веры Павловны
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Парсинг хмл
uaggster Сон Веры Павловны , какое-нибудь вменяемое чтиво по этому делу можете посоветовать? В идеале - что-то типа М.Грабера. Понимание SQL.
Увы - всё, что знаю, почерпнуто из статей MSDN по XQuery, и из тем данного раздела форума. Собранного в одном месте не видел нигде. Разве что могу порекомендовать самоучители по XQuery общего характера (т.е. без привязки к специфике MSSQL) - типа https://www.w3schools.com/xml/xquery_intro.asp
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Парсинг хмл / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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