我有一个包含以下示例的 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 文件?
最佳答案
一些方法可以做到这一点:
%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
的概念(这是我们的项目结果)。
所以我们使用动态对象
特性{(expr)}
其中expr
返回一个Array
键扩展为对象的键值对的值对。
备选方案:
%dw 2.0
output application/xml
---
{
Supermarket: {
Item: {
BarValue: payload..*Item.Name
}
}
}
最后一个之所以有效,是因为在 XML 中,当作者尝试编写一个 Array
时,它会重复包含所述 Array
的 Key
(Item) > (有效载荷..项目.名称)
关于xml - Dataweave - 循环深度映射 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57812469/