如何在Mule 4中拆分所有xml标签?

时间:2019-05-10 14:48:56

标签: mule anypoint-studio dataweave mule4

我有这样的输入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>

,并且我想仅使用parent-> child-> grandChild标签将其拆分为多个xml,以上示例总共应转换为4个xml(因为有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>

有人可以指导我吗?我一直在寻找Mule 3上可用的其他集合拆分器替代方案。

1 个答案:

答案 0 :(得分:1)

这将创建这些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)