簡體   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