【问题标题】:Dataweave - Loop in-depth mapping XMLDataweave - 循环深度映射 XML
【发布时间】:2019-09-10 02:02:50
【问题描述】:

我有一个 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 个级别

预期的输出是将同一级别的所有Items放入父节点:

<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 文件?

【问题讨论】:

  • 您想对这些项目做什么?
  • @Shoki 将每个项目映射并转换为另一种对象并存储在文件中

标签: xml loops mule dataweave depth


【解决方案1】:

一些方法:

%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 返回一个键值对Array,这些键值对被扩展为对象的键值对。

替代方案:

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

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

【讨论】:

  • 谢谢@Shoki。如您所说,只返回一个对象,而不是数组,有什么办法解决这个问题吗?
  • 哦,对了,我没有考虑到一个项目可以在同一级别有多个子项目。我将使用 MultiValue 后代选择器 (..*) 编辑答案,它不仅用于匹配第一个孩子。
【解决方案2】:

如果你想收集所有的 Item 元素,你可以使用descendant selector

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 2020-01-27
    • 2019-01-03
    • 2011-03-05
    相关资源
    最近更新 更多