I have XML Structure as shown below to be transformed to 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>
The data should transform to below JSON:
"Transactions": [
{
"Id": "Test-DataTest1-DataTest2-DataTest3"
}]
I am struggling with this mapping and need some help.
I tried working with @Jerney's answer but I need more help.
Some more info: I am using For-each processor in Mule to iterate 'PrimeEntity' and the results are aggregated later, Inside For-Each processor DWL is used which maps on 'FinEntity' and inside this "ID" details are needed. When I try to map 'PassEntity' then I am able to get desired results but i can not concat value of 'CustValue' as concatenation using '++' can not be done between string and array. the code snippet for the same is:
($.*PassEntity map
{Description: ($.*PassInnerEntity map {
data: $.Desc
})
})
The XML might have repeating complex elements such as 'FinEntity' and 'PassEntity' whilst 'RegData' will only be one. I am providing the request xml below:
<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>
The JSON Result with actual and expected details:
"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"
}]`
Following dataweave code should work fine.
%dw 1.0
%output application/json
---
Transactions : payload.Root.PrimeEntity.*FinEntity map {
Id : ($..CustValue ++ $..Desc) joinBy "-"
}
Hope this helps.