简体   繁体   中英

Nested Elements Mapping XML to JSON in DataWeave

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"
    }]`

You'll want to use the descendents selector .. to get all the Desc elements. This will return an array. Use joinBy to get this into the string you'd like:

%dw 1.0
%output application/json

%var custValue = payload.Root.PrimeEntity.FinEntity.RegData.CustValue
%var descs = payload..Desc joinBy "-"
---
{
  Transactions: [
    [
      "Id": custValue ++ '-' ++ descs
    ]
  ]
}

Output is:

{
  "Transactions": [
    [
      {
        "Id": "Test-DataTest1-DataTest2-DataTest3"
      }
    ]
  ]
}

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.

Here we go, this is gonna generate the expected output

%dw 2.0
output application/json
---
Transactions :(PrimeEntity : payload.Root.*PrimeEntity map (primeData,indexOfPrimeData) -> {
    FinEntity : primeData.*FinEntity map (FinData,indexOfFinData) -> {
        idData : (if(typeOf(FinData.RegData) != String){
            id : FinData.RegData.CustValue ++ '-' ++ (FinData..Desc joinBy '-')
         }
         else {
             id : ""
         }) 
    } 
})..idData

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM