繁体   English   中英

在 DataWeave 中将 XML 映射到 JSON 的嵌套元素

[英]Nested Elements Mapping XML to JSON in DataWeave

我有如下所示的 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”,结果稍后聚合,使用 Inside 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"
      }
    ]
  ]
}

以下 dataweave 代码应该可以正常工作。

%dw 1.0
%output application/json
---
 Transactions : payload.Root.PrimeEntity.*FinEntity map  {
    Id : ($..CustValue ++ $..Desc) joinBy "-"
}

希望这可以帮助。

我们开始吧,这将产生预期的输出

%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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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