mule - 在 DataWeave 中将 XML 映射到 JSON 的嵌套元素
问题描述
我有如下所示的 XML 结构要转换为 JSON。
<Root>
<PrimeEntity>
<FinEntity>
<RegData>
<CustValue>Test</CustValue>
</RegData>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest1</Desc>
</PassInnerEntity>
</PassEntity>
<PassInnerEntity>
<Desc>DataTest2</Desc>
</PassInnerEntity>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest3</Desc>
</PassInnerEntity>
</PassEntity>
<PassEntity>
<PassInnerEntity>
</PassInnerEntity>
</PassEntity>
</FinEntity>
</PrimeEntity></Root>
数据应转换为以下 JSON:
"Transactions": [
{
"Id": "Test-DataTest1-DataTest2-DataTest3"
}]
我正在为这个映射而苦苦挣扎,需要一些帮助。
我尝试使用@Jerney 的答案,但我需要更多帮助。
更多信息:我在 Mule 中使用 For-each 处理器来迭代“PrimeEntity”,结果稍后汇总,使用内部 For-Each 处理器 DWL,它映射到“FinEntity”和这个“ID”内部需要详细信息。当我尝试映射“PassEntity”时,我能够获得所需的结果,但我无法连接“CustValue”的值,因为无法在字符串和数组之间使用“++”进行连接。相同的代码片段是:
($.*PassEntity map
{Description: ($.*PassInnerEntity map {
data: $.Desc
})
})
XML 可能具有重复的复杂元素,例如“FinEntity”和“PassEntity”,而“RegData”将只有一个。我在下面提供请求 xml:
<Root>
<PrimeEntity>
<FinEntity>
<RegData>
Tag does not exists
</RegData>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest1</Desc>
</PassInnerEntity>
</PassEntity>
<PassInnerEntity>
<Desc>DataTest2</Desc>
</PassInnerEntity>
<PassInnerEntity>
<Desc>DataTest22</Desc>
</PassInnerEntity>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest3</Desc>
</PassInnerEntity>
</PassEntity>
<PassEntity>
<PassInnerEntity></PassInnerEntity>
</PassEntity>
</FinEntity>
<FinEntity>
<RegData>
<CustValue>Test2</CustValue>
</RegData>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest12</Desc>
</PassInnerEntity>
</PassEntity>
<PassInnerEntity>
<Desc>DataTest22</Desc>
</PassInnerEntity>
<PassInnerEntity>
<Desc>DataTest23</Desc>
</PassInnerEntity>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest24</Desc>
</PassInnerEntity>
</PassEntity>
<PassEntity>
<PassInnerEntity></PassInnerEntity>
</PassEntity>
</FinEntity>
</PrimeEntity>
<PrimeEntity>
<FinEntity>
<RegData>
<CustValue>Test3</CustValue>
</RegData>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest31</Desc>
</PassInnerEntity>
</PassEntity>
<PassInnerEntity>
<Desc>DataTest32</Desc>
</PassInnerEntity>
<PassInnerEntity>
<Desc>DataTest33</Desc>
</PassInnerEntity>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest34</Desc>
</PassInnerEntity>
</PassEntity>
<PassEntity>
<PassInnerEntity></PassInnerEntity>
</PassEntity>
</FinEntity>
<FinEntity>
<RegData>
<CustValue>Test4</CustValue>
</RegData>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest41</Desc>
</PassInnerEntity>
</PassEntity>
<PassInnerEntity>
<Desc>DataTest42</Desc>
</PassInnerEntity>
<PassInnerEntity>
<Desc>DataTest43</Desc>
</PassInnerEntity>
<PassEntity>
<PassInnerEntity>
<Desc>DataTest44</Desc>
</PassInnerEntity>
</PassEntity>
<PassEntity>
<PassInnerEntity></PassInnerEntity>
</PassEntity>
</FinEntity>
</PrimeEntity>
</Root>
具有实际和预期详细信息的 JSON 结果:
"Transactions": [
{
"Id": ""
},
{
"Id": "" -- this is coming as null but this is required. Required String
"Test2-DataTest12-DataTest22-DataTest23-DataTest24"
},
{
"Id": "Test3-DataTest31-DataTest32-DataTest33-DataTest34-DataTest41- DataTest42-DataTest43-DataTest44" -- this should be "Test3-DataTest31- DataTest32-DataTest33-DataTest34"
},
{
"Id": "Test4-DataTest31-DataTest32-DataTest33-DataTest34-DataTest41-`DataTest42-DataTest43-DataTest44" -- this should be "Test3-DataTest41-
DataTest42-DataTest43-DataTest44"
}]`
解决方案
您需要使用后代选择器..
来获取所有Desc
元素。这将返回一个数组。用于joinBy
将其放入您想要的字符串中:
%dw 1.0
%output application/json
%var custValue = payload.Root.PrimeEntity.FinEntity.RegData.CustValue
%var descs = payload..Desc joinBy "-"
---
{
Transactions: [
[
"Id": custValue ++ '-' ++ descs
]
]
}
输出是:
{
"Transactions": [
[
{
"Id": "Test-DataTest1-DataTest2-DataTest3"
}
]
]
}
推荐阅读
- matlab - 在 Matlab 中使用 Golden Search 方法进行优化
- c# - 如何将对象从客户端发送到服务器并反向?
- certificate - 证书上的“签名算法”到底是什么意思?使用哪种签名算法来签署我的证书?
- c++ - 不能用作函数,返回前的最后一行是错误
- android - 如何配置 Android Gradle 项目以过滤资源?
- javascript - 设置状态的新 Promise 接收箭头函数
- computer-vision - 如何使用 Viola Jones 算法将人脸检测为感兴趣区域并将其裁剪到矩形框?
- python - 加入列表最后几个元素并将新加入的项目附加回列表的最快和 Pythonic 方式
- python - python - 如何在python中拆分不包含分隔符的连接字符串?
- javascript - 如何正确过滤数组