Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Еще один запрос на модификацию XML  [new]
Диам
Member

Откуда:
Сообщений: 1351
Здравствуйте.
Есть необходимость изменить структуру xml из такой
+
<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>


в такую

+
<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 тоже вставляется "в лоб". Он нигде не встречается в исходнике.

Кто может помочь. Примером или за деньги
14 авг 19, 12:22    [21949066]     Ответить | Цитировать Сообщить модератору
 Re: Еще один запрос на модификацию XML  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1011
Диам, от неймспейсов только проблемно избавиться - я вспомню способ только через преобразование в строку и REPLACE, может и красивей вариант есть.

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, если есть такие, чтобы понять, правильно ли я понял логику разбиения и сработала ли она.
14 авг 19, 13:07    [21949150]     Ответить | Цитировать Сообщить модератору
 Re: Еще один запрос на модификацию XML  [new]
Диам
Member

Откуда:
Сообщений: 1351
Minamoto,
Спасибо большое. Теперь пора заняться автоматизацией )
14 авг 19, 14:51    [21949331]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить