Dataweave - 循环深度映射 XML

Dataweave - Loop in-depth mapping XML

我有一个 XML payload,其中包含以下示例:

<Example>
    <Brand>
        <Id>987S</Id>
        <logo>circle</logo>
        <Item>
            <Name>cologne1</Name>
            <Item>
                <Name>Bosque</Name>
            </Item>
        </Item>
        <Item>
            <Name>t-Shirt</Name>
        </Item>
    </Brand>
    <Brand>
        <Id>877823C</Id>
        <logo>circle</logo>
        <Item>
            <Name>t-Shirt2</Name>
            <Item>
                <Name>t-Shirt black</Name>
                <Item>
                    <Name>t-Shirt black with logo</Name>
                </Item>
            </Item>
        </Item>
    </Brand>
</Example>

XML分为:

我随机得到这个结构,直到每个项目3 层深入

期望的输出是同一级别的所有项目进入父节点:

<Supermarket>
    <Item>
        <BarValue>cologne1</BarValue>
    </Item>
    <Item>
        <BarValue>Bosque</BarValue>
    </Item>
    <Item>
        <BarValue>t-Shirt</BarValue>
    </Item>
    <Item>
        <BarValue>t-Shirt2</BarValue>
    </Item>
    <Item>
        <BarValue>t-Shirt black</BarValue>
    </Item>
    <Item>
        <BarValue>t-Shirt black with logo</BarValue>
    </Item>
</Supermarket>

有没有办法用 Dataweave 动态循环 XML 文件?

如果您想收集所有的项目元素,您可以使用 descendant selector

%dw 2.0
output application/json
---
payload..Item

如果这不是您想要的,请提供预期的输出,我们可以提供更多帮助

一些方法可以做到这一点:

%dw 2.0
output application/xml
---
{
    Supermarket: {(
        payload..*Item map {
            Item: {
                BarValue: $.Name
            }
        }
    )}
}

后代选择器payload..Item 获取任何级别的所有项目。然后,对于每个 Item,我们生成一个带有 {Item: {BarValue: $.Name}} 的对象,并获得一个 Array 的项目对象。

问题是DataWeave中的XML模型用ObjectsStrings表示元素标签和值,没有Array的概念(这是我们的项目的结果)。

所以我们使用 Dynamic Object 特征 {(expr)} 其中 expr returns 一个 Array 的键值对扩展为键值对对象。

选择:

%dw 2.0
output application/xml
---
{
    Supermarket: {
        Item: {
            BarValue: payload..*Item.Name
        }
    }
}

最后一个有效,因为在 XML 中,当作者尝试编写 Array 时,它会重复 Key(项目),其中包含所述 Array(有效载荷..Item.Name)