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
分为:
- 例如根节点
- 品牌对象
- Item 对象:这些 Items 还可以包含更多 Items
我随机得到这个结构,直到每个项目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模型用Objects
和Strings
表示元素标签和值,没有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)
我有一个 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
分为:
- 例如根节点
- 品牌对象
- Item 对象:这些 Items 还可以包含更多 Items
- 品牌对象
我随机得到这个结构,直到每个项目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模型用Objects
和Strings
表示元素标签和值,没有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)