Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Еще один запрос на модификацию XML / 3 сообщений из 3, страница 1 из 1
14.08.2019, 12:22
    #39849183
Диам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще один запрос на модификацию XML
Здравствуйте.
Есть необходимость изменить структуру xml из такой
Код: plaintext
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.
65.
66.
67.
68.
69.
<response xmlns="LoginomDecisionMaker">
	<items>
		<et>REPORT_HEADER</et>
		<eid>A00FB6CC43A8E7499D0324C68ADD975D</eid>
		<k>CRA_CODE</k>
		<v>НБКИ</v>
	</items>
	<items>
		<et>REPORT_HEADER</et>
		<eid>A00FB6CC43A8E7499D0324C68ADD975D</eid>
		<k>PARENT_ID</k>
		<v>2C5F109A4D2D044E9C1CE2911F566476</v>
	</items>
<items>
		<et>PERSON_DATA</et>
		<eid>1936180C928C1F4886755335EA686B35</eid>
		<k>CRA_CODE</k>
		<v>НБКИ</v>
	</items>
	<items>
		<et>PERSON_DATA</et>
		<eid>1936180C928C1F4886755335EA686B35</eid>
		<k>PARENT_ID</k>
		<v>2C5F109A4D2D044E9C1CE2911F566476</v>
	</items>
	<items>
		<et>PERSON_DATA</et>
		<eid>1936180C928C1F4886755335EA686B35</eid>
		<k>name1</k>
		<v>BUSH</v>
	</items>
	<items>
		<et>PERSON_DATA</et>
		<eid>1936180C928C1F4886755335EA686B35</eid>
		<k>first</k>
		<v>GEORGE</v>
	</items>

<items>
		<et>PERSON_DATA</et>
		<eid>0F369AFFC11C864AB9911E72FFB4A6B2</eid>
		<k>CRA_CODE</k>
		<v>НБКИ</v>
	</items>
	<items>
		<et>PERSON_DATA</et>
		<eid>0F369AFFC11C864AB9911E72FFB4A6B2</eid>
		<k>PARENT_ID</k>
		<v>2C5F109A4D2D044E9C1CE2911F566476</v>
	</items>
	<items>
		<et>PERSON_DATA</et>
		<eid>0F369AFFC11C864AB9911E72FFB4A6B2</eid>
		<k>name1</k>
		<v>КУСТОВ</v>
	</items>
	<items>
		<et>PERSON_DATA</et>
		<eid>0F369AFFC11C864AB9911E72FFB4A6B2</eid>
		<k>first</k>
		<v>ГЕОРГИЙ</v>
	</items>
	<items>
		<et>PERSON_DATA</et>
		<eid>0F369AFFC11C864AB9911E72FFB4A6B2</eid>
		<k>paternal</k>
		<v>ГЕОРГИЕВИЧ</v>
	</items>

</response>


в такую

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<DOCUMENTS>
	<REPORT>
		<ID>2C5F109A4D2D044E9C1CE2911F566476</ID>
		<REPORT_HEADER>
			<eid>A00FB6CC43A8E7499D0324C68ADD975D</eid>
			<CRA_CODE>НБКИ</CRA_CODE>
		</REPORT_HEADER>
		<PERSON_DATA>
			<eid>1936180C928C1F4886755335EA686B35</eid>
			<CRA_CODE>НБКИ</CRA_CODE>
			<name1>BUSH</name1>
			<first>GEORGE</first>
		</PERSON_DATA>
		<PERSON_DATA>
			<eid>0F369AFFC11C864AB9911E72FFB4A6B2</eid>
			<CRA_CODE>НБКИ</CRA_CODE>
			<name1>КУСТОВ</name1>
			<first>ГЕОРГИЙ</first>
			<paternal>ГЕОРГИЕВИЧ</paternal>
		</PERSON_DATA>
	</REPORT>
</DOCUMENTS>


Основной элемент надо самим поменять с response на DOCUMENT. Элемент REPORT тоже вставляется "в лоб". Он нигде не встречается в исходнике.

Кто может помочь. Примером или за деньги
...
Рейтинг: 0 / 0
14.08.2019, 13:07
    #39849219
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще один запрос на модификацию XML
Диам, от неймспейсов только проблемно избавиться - я вспомню способ только через преобразование в строку и REPLACE, может и красивей вариант есть.

Код: 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.
WITH xmlnamespaces
    (
        DEFAULT 'LoginomDecisionMaker'
    )
SELECT 
    t.rep_id AS 'ID',
    t.rh_eid AS 'REPORT_HEADER/eid',
    t.cra_code AS 'REPORT_HEADER/CRA_CODE',
    (
        SELECT  pd_eid.c AS 'eid',
                @x.value('(/response/items[et/text() = "PERSON_DATA" and k/text() = "CRA_CODE" and eid/text() = sql:column("pd_eid.c")]/v/text())[1]', 'nvarchar(100)') AS 'CRA_CODE',
                @x.value('(/response/items[et/text() = "PERSON_DATA" and k/text() = "name1" and eid/text() = sql:column("pd_eid.c")]/v/text())[1]', 'nvarchar(100)') AS 'name1',
                @x.value('(/response/items[et/text() = "PERSON_DATA" and k/text() = "first" and eid/text() = sql:column("pd_eid.c")]/v/text())[1]', 'nvarchar(100)') AS 'first',
                @x.value('(/response/items[et/text() = "PERSON_DATA" and k/text() = "paternal" and eid/text() = sql:column("pd_eid.c")]/v/text())[1]', 'nvarchar(100)') AS 'paternal'
        FROM    @x.nodes('/response/items[et/text() = "PERSON_DATA" and k/text() = "PARENT_ID" and v/text() = sql:column("t.rep_id")]') AS pd_id (c)
                CROSS APPLY (VALUES (pd_id.c.value('(eid/text())[1]', 'nvarchar(100)'))) AS pd_eid (c)
        FOR XML PATH ('PERSON_DATA'), TYPE
    )
FROM
    (
        SELECT DISTINCT  
            rep_id.c AS rep_id,
            rh_eid.c AS rh_eid,
            cra.c.value('(v/text())[1]', 'nvarchar(100)') AS cra_code
        FROM
            @x.nodes('/response/items[k/text() = "PARENT_ID"]') AS t(c)
            CROSS APPLY (VALUES (t.c.value('(v/text())[1]', 'nvarchar(100)'))) AS rep_id(c)
            CROSS APPLY t.c.nodes('/response/items[et/text() = "REPORT_HEADER" and k/text() = "PARENT_ID" and v/text() = sql:column("rep_id.c")]') AS rh(c)
            CROSS APPLY (VALUES (rh.c.value('(eid/text())[1]', 'nvarchar(100)'))) AS rh_eid (c)
            CROSS APPLY t.c.nodes('/response/items[et/text() = "REPORT_HEADER" and k/text() = "CRA_CODE" and eid/text() = sql:column("rh_eid.c")]') AS cra(c)
    ) AS t
for xml path('REPORT'), root('DOCUMENTS'), type



Проверьте вариант с несколькими REPORT/ID, если есть такие, чтобы понять, правильно ли я понял логику разбиения и сработала ли она.
...
Рейтинг: 0 / 0
14.08.2019, 14:51
    #39849288
Диам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Еще один запрос на модификацию XML
Minamoto,
Спасибо большое. Теперь пора заняться автоматизацией )
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Еще один запрос на модификацию XML / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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