Разделить XML на основе дочернего элемента и перебрать динамический тег - PullRequest
1 голос
/ 25 сентября 2019

в моем потоке Mule я буду вызывать хранимую процедуру, которая выдаст мне XML-ответ примерно так:

<RESULT xmlns="some_stored_proc:Response">
   <ROOT_TAG>
      <RESULTSET_1>
         <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>1</hasError>
        </ROW>
        <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>1</hasError>
        </ROW>
    </RESULTSET_1>
<RESULTSET_2>
         <ROW>
            <A>0.3</A>
            <B>0.2</B>
            <C>1.1</C>
            <hasError>0</hasError>
        </ROW>
        <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>0</hasError>
        </ROW>
    </RESULTSET_2>  
<RESULTSET_3>
         <ROW>
            <A>1.1</A>
            <B>2.4</B>
            <C>1.8</C>
            <hasError>0</hasError>
        </ROW>
        <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>0</hasError>
        </ROW>
    </RESULTSET_3>  
</ROOT_TAG> 
</RESULT>   

, теперь в моем хранилище данных я хочу пройти через этот XML и любойдля которого установлено значение 1, они приводятся под корневым тегом ISSUES

<ISSUES>
     <ROW>
        <A>0.1</A>
        <B>0.4</B>
        <C>1.0</C>
        <hasError>1</hasError>
    </ROW>
    <ROW>
        <A>0.1</A>
        <B>0.4</B>
        <C>1.0</C>
        <hasError>1</hasError>
    </ROW>
</ISSUES>

, а остальные строки отправляются в DOCUMENT, как это

    <DOCUMENT>
         <ROW>
            <A>0.3</A>
            <B>0.2</B>
            <C>1.1</C>
            <hasError>0</hasError>
        </ROW>
        <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>0</hasError>
        </ROW>
         <ROW>
            <A>1.1</A>
            <B>2.4</B>
            <C>1.8</C>
            <hasError>0</hasError>
        </ROW>
        <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>0</hasError>
        </ROW>
    </DOCUMENT> 

я продолжаю нажимать одно или другое исключение.

ПРИМЕЧАНИЕ: Может быть любое количество тегов <RESULTSET_n>, основанных на размере входных данных и размере группы, которые используются в качестве входных данных для хранимой процедуры базы данных.Так что этот тег будет динамичным.

1 Ответ

5 голосов
/ 25 сентября 2019

Итак, в основном я использовал функцию groupBy, чтобы разделить ваш документ на действительный и недействительный. Я преобразую каждую часть в ожидаемую структуру данных

%dw 2.0
output application/xml
import * from dw::core::Objects
---
{ 
    RESULT: {( 
payload.RESULT.ROOT_TAG 
    groupBy ((value, key) -> (key as String match /RESULTSET_([0-9]+)/)[1] == "1")
    pluck ((value, key, index) -> 
        key as String match {
            case "true" -> 
                { ISSUES: {(valueSet(value))}}
            case "false" -> 
                { DOCUMENT: {(valueSet(value))}}
        }
    )

    )}
}
...