使用dataweave 2递归解析XML以创建JSON数组 [英] Recursively parse XML to create JSON array using dataweave 2
问题描述
我正在尝试递归解析XML以使用dataweave 2创建JSON数组,但是我无法做到这一点.
I am trying to parse an XML recursively to create JSON array using dataweave 2 but I am not able to do so.
我的输入XML如下-
<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
<Header>
<MessageId>{8736346D-A766-4BE1-8592-C263A4CC2AB5}</MessageId>
<Action>http://schemas.microsoft.com/dynamics/2008/01/services/BomBillsofMaterialsService/read</Action>
</Header>
<Body>
<MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
<BillsOfMaterials xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/BillsOfMaterials">
<DocPurpose>Original</DocPurpose>
<SenderId>121</SenderId>
<BOMVersion class="entity">
<_DocumentHash>5c32768c0e32d542255d67340fda7a9d</_DocumentHash>
<Active>Yes</Active>
<Approved>Yes</Approved>
<Approver>NoUser</Approver>
<BOMId>BOM0012610</BOMId>
<Construction>No</Construction>
<InventDimId>IDM0000001</InventDimId>
<ItemId>9641716</ItemId>
<ItemIdCommercial/>
<Name>Prepress Bundle - Folding Carton</Name>
<QBE_AddedByContainer>Yes</QBE_AddedByContainer>
<RecId>5637161354</RecId>
<RecVersion>1034011536</RecVersion>
<BOMTable class="entity">
<Approved>Yes</Approved>
<Approver>NoUser</Approver>
<BOMId>BOM0012610</BOMId>
<CheckBOM>Yes</CheckBOM>
<Name>Prepress Bundle - Folding Carton</Name>
<RecId>5637160605</RecId>
<RecVersion>450200996</RecVersion>
<SiteId>2</SiteId>
<BOM class="entity">
<BOMConsump>Variable</BOMConsump>
<BOMId>BOM0012610</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMQtySerie>1</BOMQtySerie>
<BOMType>Item</BOMType>
<Calculation>Yes</Calculation>
<EndSchedConsump>No</EndSchedConsump>
<Formula>Formula0</Formula>
<InventDimId>IDM0000031</InventDimId>
<ItemId>96AR169X</ItemId>
<LineNum>1.0000000000</LineNum>
<ProdFlushingPrincip>Blank</ProdFlushingPrincip>
<ProjSetSubProdToConsumed>No</ProjSetSubProdToConsumed>
<RecId>5637300477</RecId>
<RecVersion>1</RecVersion>
<RoundUp>No</RoundUp>
<UnitId>PCS</UnitId>
<WrkCtrConsumption>false</WrkCtrConsumption>
<InventDimBOM class="entity">
<InventDimId>IDM0000031</InventDimId>
<InventLocationId>51ST</InventLocationId>
<InventSiteId>2</InventSiteId>
<RecId>5637213319</RecId>
<RecVersion>1</RecVersion>
</InventDimBOM>
<BOMTable>
<BOMId>BOM011986</BOMId>
<Name/>
<Approved>Yes</Approved>
<BOM>
<LineNum>1.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>96AR060W</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>111111111</RecId>
</BOM>
<BOM>
<LineNum>2.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>96AR158</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>222222</RecId>
</BOM>
<BOM>
<LineNum>3.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>96AR582O</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>333333333</RecId>
<BOMTable>
<BOMId>BOM0013773</BOMId>
<Name>ArtiosCAD 14 A6 Software box (Standard Edition)</Name>
<Approved>Yes</Approved>
<BOM>
<LineNum>1000.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>G211249</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>4444444</RecId>
</BOM>
<BOM>
<LineNum>1006.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>G25583954_46</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>55555555</RecId>
</BOM>
</BOMTable>
<BOMTable>
<BOMId>BOM0013773</BOMId>
<Name>ArtiosCAD 14 A6 Software box (Standard Edition)</Name>
<Approved>Yes</Approved>
<RecId>333333333</RecId>
<BOM>
<LineNum>1000.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>G211249</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>66666666</RecId>
</BOM>
<BOM>
<LineNum>1006.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>G25583954_46</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>77777777777</RecId>
</BOM>
</BOMTable>
</BOM>
</BOMTable>
</BOM>
<BOM class="entity">
<BOMConsump>Variable</BOMConsump>
<BOMId>BOM0012610</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMQtySerie>1</BOMQtySerie>
<BOMType>Item</BOMType>
<Calculation>Yes</Calculation>
<EndSchedConsump>No</EndSchedConsump>
<Formula>Formula0</Formula>
<InventDimId>IDM0000002</InventDimId>
<ItemId>9646095W</ItemId>
<LineNum>11.0000000000</LineNum>
<ProdFlushingPrincip>Blank</ProdFlushingPrincip>
<ProjSetSubProdToConsumed>No</ProjSetSubProdToConsumed>
<RecId>5637300487</RecId>
<RecVersion>1</RecVersion>
<RoundUp>No</RoundUp>
<UnitId>PCS</UnitId>
<WrkCtrConsumption>false</WrkCtrConsumption>
<InventDimBOM class="entity">
<InventDimId>IDM0000002</InventDimId>
<InventLocationId>NOLOC</InventLocationId>
<InventSiteId>2</InventSiteId>
<RecId>5637213290</RecId>
<RecVersion>1</RecVersion>
</InventDimBOM>
</BOM>
<BOM class="entity">
<BOMConsump>Variable</BOMConsump>
<BOMId>BOM0012610</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMQtySerie>1</BOMQtySerie>
<BOMType>Item</BOMType>
<Calculation>Yes</Calculation>
<EndSchedConsump>No</EndSchedConsump>
<Formula>Formula0</Formula>
<InventDimId>IDM0000002</InventDimId>
<ItemId>9648376X</ItemId>
<LineNum>12.0000000000</LineNum>
<ProdFlushingPrincip>Blank</ProdFlushingPrincip>
<ProjSetSubProdToConsumed>No</ProjSetSubProdToConsumed>
<RecId>5637300488</RecId>
<RecVersion>1</RecVersion>
<RoundUp>No</RoundUp>
<UnitId>PCS</UnitId>
<WrkCtrConsumption>false</WrkCtrConsumption>
<InventDimBOM class="entity">
<InventDimId>IDM0000002</InventDimId>
<InventLocationId>NOLOC</InventLocationId>
<InventSiteId>2</InventSiteId>
<RecId>5637213290</RecId>
<RecVersion>1</RecVersion>
</InventDimBOM>
<BOMTable>
<BOMId>BOM011638</BOMId>
<Name/>
<Approved>Yes</Approved>
<BOM>
<LineNum>1.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>9645340X</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>888888888</RecId>
</BOM>
<BOM>
<LineNum>2.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>9644384Y</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>9999999999</RecId>
</BOM>
</BOMTable>
</BOM>
<BOM class="entity">
<BOMConsump>Variable</BOMConsump>
<BOMId>BOM0012610</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMQtySerie>1</BOMQtySerie>
<BOMType>Item</BOMType>
<Calculation>Yes</Calculation>
<EndSchedConsump>No</EndSchedConsump>
<Formula>Formula0</Formula>
<InventDimId>IDM0000003</InventDimId>
<ItemId>9643908X</ItemId>
<LineNum>13.0000000000</LineNum>
<ProdFlushingPrincip>Blank</ProdFlushingPrincip>
<ProjSetSubProdToConsumed>No</ProjSetSubProdToConsumed>
<RecId>5637300489</RecId>
<RecVersion>1</RecVersion>
<RoundUp>No</RoundUp>
<UnitId>PCS</UnitId>
<WrkCtrConsumption>false</WrkCtrConsumption>
<InventDimBOM class="entity">
<InventDimId>IDM0000003</InventDimId>
<InventLocationId>01</InventLocationId>
<InventSiteId>2</InventSiteId>
<RecId>5637213291</RecId>
<RecVersion>1</RecVersion>
</InventDimBOM>
<BOMTable>
<BOMId>BOM011299</BOMId>
<Name/>
<Approved>Yes</Approved>
<RecId>555555555</RecId>
<BOM>
<LineNum>1.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>9642737Y</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>101010101</RecId>
</BOM>
<BOM>
<LineNum>3.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>9642736Y</ItemId>
<BOMQty>1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>1112112112</RecId>
</BOM>
</BOMTable>
</BOM>
<BOM class="entity">
<BOMConsump>Variable</BOMConsump>
<BOMId>BOM0012610</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMQtySerie>1</BOMQtySerie>
<BOMType>Item</BOMType>
<Calculation>Yes</Calculation>
<EndSchedConsump>No</EndSchedConsump>
<Formula>Formula0</Formula>
<InventDimId>IDM0000003</InventDimId>
<ItemId>9642837X</ItemId>
<LineNum>14.0000000000</LineNum>
<ProdFlushingPrincip>Blank</ProdFlushingPrincip>
<ProjSetSubProdToConsumed>No</ProjSetSubProdToConsumed>
<RecId>5637300490</RecId>
<RecVersion>1</RecVersion>
<RoundUp>No</RoundUp>
<UnitId>PCS</UnitId>
<WrkCtrConsumption>false</WrkCtrConsumption>
<InventDimBOM class="entity">
<InventDimId>IDM0000003</InventDimId>
<InventLocationId>01</InventLocationId>
<InventSiteId>2</InventSiteId>
<RecId>5637213291</RecId>
<RecVersion>1</RecVersion>
</InventDimBOM>
<BOMTable>
<BOMId>BOM011245</BOMId>
<Name/>
<Approved>Yes</Approved>
<BOM>
<LineNum>1.00</LineNum>
<BOMType>Item</BOMType>
<ItemId>9644384Y</ItemId>
<BOMQty>-1.00</BOMQty>
<OprNum>0</OprNum>
<FromDate>1900-01-01</FromDate>
<UnitId>PCS</UnitId>
<RecId>13131313</RecId>
</BOM>
</BOMTable>
</BOM>
</BOMTable>
<InventDim class="entity">
<InventDimId>IDM0000001</InventDimId>
<InventSiteId>2</InventSiteId>
<RecId>5637199988</RecId>
<RecVersion>1</RecVersion>
</InventDim>
</BOMVersion>
</BillsOfMaterials>
</MessageParts>
</Body>
</Envelope>
我要创建所有BOM的JSON数组(无层次结构的扁平结构),如下所示-
I want to create JSON array of all the BOMs (a flat structure with no hierarchy) as shown below -
输出-
[
{
"id": "5637300477",
"productId": "96AR169X",
"parentId": null
},
{
"id": "111111111",
"productId": "96AR060W",
"parentId" : "BOM011986"
},
{
"id": "222222",
"productId": "96AR158",
"parentId" : "BOM011986"
},
{
"id": "333333333",
"productId": "96AR582O",
"parentId": "BOM011986"
},
{
"id": "4444444",
"productId": "G211249",
"parentId" : "BOM0013773"
},
{
"id": "55555555",
"productId": "G25583954_46",
"parentId" : "BOM0013773"
},
{
"id": "66666666",
"productId": "BOM0013773",
"parentId" : "BOM0013773"
},
{
"id": "77777777777",
"productId": "G25583954_46",
"parentId" : "BOM0013773"
},
{
"id": "5637300487",
"productId": "9646095W",
"parentId" : null
},
{
"id": "5637300488",
"productId": "9648376X",
"parentId" : null
},
.
]
在这种情况下,我无法弄清楚递归的使用.我对Dataweave语言很陌生,因为它是功能语言.我已经习惯了Java语言.
I not able to figure it out the use of recursion in this case. I am quite new to Dataweave language as it is functional language. I am used to Java language.
在此先感谢您的帮助!
推荐答案
您可以使用后代数据选择器(使用..)从xml文档中检索所有BOMTable,因此无需递归浏览文档.然后使用map/flatMap输出必要的字段.
You can make use of descendant data selector (using ..) to retrieve all BOMTable from your xml document and thus there is no need to recursively navigate through your document. Then using map/flatMap to output the necessary fields.
请参见下面的数据编织:
Please see below dataweave:
%dw 2.0
output application/json
---
payload..*BOMTable flatMap (bomTable) -> bomTable.*BOM map (bomValue) ->
{
id: bomValue.RecId,
productId: bomValue.ItemId,
parentId: bomTable.RecId
}
输出如下:
[
{
"id": "5637300477",
"productId": "96AR169X",
"parentId": "5637160605"
},
{
"id": "5637300487",
"productId": "9646095W",
"parentId": "5637160605"
},
{
"id": "5637300488",
"productId": "9648376X",
"parentId": "5637160605"
},
{
"id": "5637300489",
"productId": "9643908X",
"parentId": "5637160605"
},
{
"id": "5637300490",
"productId": "9642837X",
"parentId": "5637160605"
},
{
"id": "111111111",
"productId": "96AR060W",
"parentId": null
},
{
"id": "222222",
"productId": "96AR158",
"parentId": null
},
{
"id": "333333333",
"productId": "96AR582O",
"parentId": null
},
{
"id": "4444444",
"productId": "G211249",
"parentId": null
},
{
"id": "55555555",
"productId": "G25583954_46",
"parentId": null
},
{
"id": "66666666",
"productId": "G211249",
"parentId": "333333333"
},
{
"id": "77777777777",
"productId": "G25583954_46",
"parentId": "333333333"
},
{
"id": "888888888",
"productId": "9645340X",
"parentId": null
},
{
"id": "9999999999",
"productId": "9644384Y",
"parentId": null
},
{
"id": "101010101",
"productId": "9642737Y",
"parentId": "555555555"
},
{
"id": "1112112112",
"productId": "9642736Y",
"parentId": "555555555"
},
{
"id": "13131313",
"productId": "9644384Y",
"parentId": null
}
]
请注意,根据您在其中一条评论中发布的映射规则,输出仍然与您发布的预期输出不同,我认为这是不正确的.
Note that the output is still different from the expected output that you posted which I think is incorrect based on the mapping rules you posted in one of your comments.
这篇关于使用dataweave 2递归解析XML以创建JSON数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!