Как разделить все теги XML в Mule 4? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть входной XML, как это

<parent>
    <child type="reference">
        <grandChild name="aaa" action="None">
            <Attribute name="xxx">1</Attribute>
            <grandChild name="bbb" action="None">
                <Attribute name="xxx">1</Attribute>
            </grandChild>
            <grandChild name="ccc" action="None">
                <Attribute name="xxx">1</Attribute>
            </grandChild>
        </grandChild>
        <grandChild name="ddd" action="None">
                <Attribute name="xxx">1</Attribute>
        </grandChild>
    </child>
</parent>

и я хочу разделить его на несколько xmls только с тегами parent-> child-> grandChild. В целом приведенный выше пример должен быть преобразован в 4 xmls (из-за 4 grandChild). Как это -

<parent>
    <child type="reference">
        <grandChild name="aaa" action="None">
                <Attribute name="xxx">1</Attribute>
        </grandChild>
    </child>
</parent>
<parent>
    <child type="reference">
        <grandChild name="bbb" action="None">
                <Attribute name="xxx">1</Attribute>
        </grandChild>
    </child>
</parent>
<parent>
    <child type="reference">
        <grandChild name="ccc" action="None">
                <Attribute name="xxx">1</Attribute>
        </grandChild>
    </child>
</parent>
<parent>
    <child type="reference">
        <grandChild name="ddd" action="None">
                <Attribute name="xxx">1</Attribute>
        </grandChild>
    </child>
</parent>

Может кто-нибудь, пожалуйста, подскажите мне об этом? Я искал некоторые альтернативы разделителя коллекций, которые были на Муле 3 или любым другим возможным способом.

1 Ответ

1 голос
/ 10 мая 2019

Это создаст массив этих xml, поэтому, если вы поместите это выражение в выражение foreach, оно будет делать то, что вам нужно.

%dw 2.0
import dw::core::Objects

fun collectChilds(node) = do {
    var children = node.&grandChild default {}
    ---
    (children mapObject ((item, key) -> {
        parent: {
            child @("type": "reference") : {
                (key) : item.&Attribute
            }
        }
    }) pluck ((value, key, index) -> {(key) : value})
    ) ++ (Objects::valueSet(children) flatMap ((item, index) -> collectChilds(item)))
}
---
collectChilds(payload.parent.child)
...