XML 使用 dataweave 2 解析以转换 json
XML parsing to transform json using dataweave 2
我正在尝试递归解析 XML 以使用 dataweave 2 创建 JSON 数组,但我无法这样做。
我的输入 XML 如下 -
<?xml version="1.0" encoding="utf-16"?>
<MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
<BillsOfMaterials xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/BillsOfMaterials">
<SenderId>121</SenderId>
<BOMVersion class="entity">
<BOMId>BOM0012605</BOMId>
<ItemId>9650084</ItemId>
<ItemIdCommercial></ItemIdCommercial>
<Name>SmartRip for Folding Carton</Name>
<RecId>5637161103</RecId>
<BOMTable class="entity">
<BOMId>BOM0012605</BOMId>
<Name>SmartRip for Folding Carton</Name>
<RecId>5637160354</RecId>
<BOM class="entity">
<BOMId>BOM0012605</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMType>Item</BOMType>
<ItemId>9650092</ItemId>
<RecId>5637307757</RecId>
<UnitId>PCS</UnitId>
<InventDimBOM class="entity">
<RecId>5637213290</RecId>
</InventDimBOM>
<BOMTable>
<BOMId>BOM0012613</BOMId>
<Name>FlexRip Classic Intel kernel and tools</Name>
<RecId>5637161355</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9650079</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012613</BOMId>
<RecId>5637307799</RecId>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9644919T</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012613</BOMId>
<RecId>5637307800</RecId>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9644920</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012613</BOMId>
<RecId>5637307801</RecId>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9700720Z</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012613</BOMId>
<RecId>5637307802</RecId>
<BOMTable>
<BOMId>BOM012173</BOMId>
<Name></Name>
<RecId>5637157832</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9700595</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM012173</BOMId>
<RecId>5637333626</RecId>
</BOM>
</BOMTable>
<BOMTable>
<BOMId>BOM012173</BOMId>
<Name></Name>
<RecId>5637157832</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9700595</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM012173</BOMId>
<RecId>5637333626</RecId>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9608224Z</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM012173</BOMId>
<RecId>5637333627</RecId>
</BOM>
</BOMTable>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9683336L</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012613</BOMId>
<RecId>5637307803</RecId>
<BOMTable>
<BOMId>BOM0012781</BOMId>
<Name>Esko Suite 12.1 A5 Software box</Name>
<RecId>5637165603</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>G211249</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012781</BOMId>
<RecId>5637309242</RecId>
</BOM>
</BOMTable>
<BOMTable>
<BOMId>BOM0012781</BOMId>
<Name>Esko Suite 12.1 A5 Software box</Name>
<RecId>5637165603</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>G211249</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012781</BOMId>
<RecId>5637309242</RecId>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>G25583961_24</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012781</BOMId>
<RecId>5637309243</RecId>
</BOM>
</BOMTable>
</BOM>
</BOMTable>
</BOM>
<BOM class="entity">
<BOMId>BOM0012605</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMType>Item</BOMType>
<ItemId>9608221Z</ItemId>
<RecId>5637307758</RecId>
<UnitId>PCS</UnitId>
<InventDimBOM class="entity">
<RecId>5637213290</RecId>
</InventDimBOM>
</BOM>
<BOM class="entity">
<BOMId>BOM0012605</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMType>Item</BOMType>
<ItemId>9700624Y</ItemId>
<RecId>5637307759</RecId>
<UnitId>PCS</UnitId>
<InventDimBOM class="entity">
<RecId>5637213291</RecId>
</InventDimBOM>
<BOMTable>
<BOMId>BOM012172</BOMId>
<Name></Name>
<RecId>5637157831</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9644921</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM012172</BOMId>
<RecId>5637333624</RecId>
</BOM>
</BOMTable>
</BOM>
<BOM class="entity">
<BOMId>BOM0012605</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMType>Item</BOMType>
<ItemId>9700815</ItemId>
<RecId>5637307760</RecId>
<UnitId>PCS</UnitId>
<InventDimBOM class="entity">
<RecId>5637213290</RecId>
</InventDimBOM>
</BOM>
</BOMTable>
<InventDim class="entity">
<RecId>5637199988</RecId>
</InventDim>
</BOMVersion>
</BillsOfMaterials>
</MessageParts>
我想创建 JSON 所有 BOM 的数组(没有层次结构的平面结构),parentId 作为父 BOM 的 RecId,如下所示 -
输出-
[
{
"id": "5637307757",
"productId": "9650092",
"parentId": null
},
{
"id": "5637307799",
"productId": "9650079",
"parentId": "5637307757"
},
{
"id": "5637307800",
"productId": "9644919T",
"parentId": "5637307757"
},
{
"id": "5637307801",
"productId": "96AR060W",
"parentId": "5637307757"
},
{
"id": "5637307802",
"productId": "9700720Z",
"parentId": "5637307757"
},
{
"id": "5637333626",
"productId": "9700595",
"parentId": "5637307802"
},
{
"id": "5637333626",
"productId": "9700595",
"parentId": "5637307802"
},
{
"id": "5637333627",
"productId": "9608224Z",
"parentId": "5637307802"
},
{
"id": "5637307803",
"productId": "9683336L",
"parentId": "5637307757"
},
{
"id": "5637309242",
"productId": "G211249",
"parentId": "5637307803"
},
{
"id": "5637309242",
"productId": "G211249",
"parentId": "5637307803"
},
{
"id": "5637309243",
"productId": "G25583961_24",
"parentId": "5637307803"
}
]
映射规则-
- id : BOM -> RecId
- productId : BOM -> ItemId
- parentId : 父BOM的RecId
与建议答案的不同之处在于,我需要使用 BOM 的直接 recid 设置 parentid,而不是 BOM table。
似乎您的输出在给定输入的情况下仍然是错误的(例如,产品 ID 96AR060W 不在输入 xml 中)。要回答您的问题而不是收集所有 BOM 对象,您可以遍历单个 BOM 对象以保存父 ID 并创建一个可以递归调用的函数。请看下面的数据编织:
%dw 2.0
output application/json
fun parseBOM(bomData, parentId) =
if (bomData.BOMTable.BOM?)
[{
id: bomData.RecId,
productId: bomData.ItemId,
parentId: parentId
}] ++ (bomData.BOMTable.*BOM flatMap parseBOM($, bomData.RecId))
else {
id: bomData.RecId,
productId: bomData.ItemId,
parentId: parentId
}
---
using (firstBOMTable = payload.MessageParts.BillsOfMaterials.BOMVersion.BOMTable)
firstBOMTable.*BOM flatMap parseBOM($, null)
鉴于您的输入 xml,这将导致
[
{
"id": "5637307757",
"productId": "9650092",
"parentId": null
},
{
"id": "5637307799",
"productId": "9650079",
"parentId": "5637307757"
},
{
"id": "5637307800",
"productId": "9644919T",
"parentId": "5637307757"
},
{
"id": "5637307801",
"productId": "9644920",
"parentId": "5637307757"
},
{
"id": "5637307802",
"productId": "9700720Z",
"parentId": "5637307757"
},
{
"id": "5637333626",
"productId": "9700595",
"parentId": "5637307802"
},
{
"id": "5637333627",
"productId": "9608224Z",
"parentId": "5637307802"
},
{
"id": "5637307803",
"productId": "9683336L",
"parentId": "5637307757"
},
{
"id": "5637309242",
"productId": "G211249",
"parentId": "5637307803"
},
{
"id": "5637309243",
"productId": "G25583961_24",
"parentId": "5637307803"
},
{
"id": "5637307758",
"productId": "9608221Z",
"parentId": null
},
{
"id": "5637307759",
"productId": "9700624Y",
"parentId": null
},
{
"id": "5637333624",
"productId": "9644921",
"parentId": "5637307759"
},
{
"id": "5637307760",
"productId": "9700815",
"parentId": null
}
]
该函数的作用是,如果提供的对象 (bomData) 包含 BOMTable.BOM,则创建所需的对象并使用其下的所有 BOM 对象再次调用相同的函数。该函数也接受 parentId 作为参数来保存它。
我正在尝试递归解析 XML 以使用 dataweave 2 创建 JSON 数组,但我无法这样做。
我的输入 XML 如下 -
<?xml version="1.0" encoding="utf-16"?>
<MessageParts xmlns="http://schemas.microsoft.com/dynamics/2011/01/documents/Message">
<BillsOfMaterials xmlns="http://schemas.microsoft.com/dynamics/2008/01/documents/BillsOfMaterials">
<SenderId>121</SenderId>
<BOMVersion class="entity">
<BOMId>BOM0012605</BOMId>
<ItemId>9650084</ItemId>
<ItemIdCommercial></ItemIdCommercial>
<Name>SmartRip for Folding Carton</Name>
<RecId>5637161103</RecId>
<BOMTable class="entity">
<BOMId>BOM0012605</BOMId>
<Name>SmartRip for Folding Carton</Name>
<RecId>5637160354</RecId>
<BOM class="entity">
<BOMId>BOM0012605</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMType>Item</BOMType>
<ItemId>9650092</ItemId>
<RecId>5637307757</RecId>
<UnitId>PCS</UnitId>
<InventDimBOM class="entity">
<RecId>5637213290</RecId>
</InventDimBOM>
<BOMTable>
<BOMId>BOM0012613</BOMId>
<Name>FlexRip Classic Intel kernel and tools</Name>
<RecId>5637161355</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9650079</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012613</BOMId>
<RecId>5637307799</RecId>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9644919T</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012613</BOMId>
<RecId>5637307800</RecId>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9644920</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012613</BOMId>
<RecId>5637307801</RecId>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9700720Z</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012613</BOMId>
<RecId>5637307802</RecId>
<BOMTable>
<BOMId>BOM012173</BOMId>
<Name></Name>
<RecId>5637157832</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9700595</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM012173</BOMId>
<RecId>5637333626</RecId>
</BOM>
</BOMTable>
<BOMTable>
<BOMId>BOM012173</BOMId>
<Name></Name>
<RecId>5637157832</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9700595</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM012173</BOMId>
<RecId>5637333626</RecId>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9608224Z</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM012173</BOMId>
<RecId>5637333627</RecId>
</BOM>
</BOMTable>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9683336L</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012613</BOMId>
<RecId>5637307803</RecId>
<BOMTable>
<BOMId>BOM0012781</BOMId>
<Name>Esko Suite 12.1 A5 Software box</Name>
<RecId>5637165603</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>G211249</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012781</BOMId>
<RecId>5637309242</RecId>
</BOM>
</BOMTable>
<BOMTable>
<BOMId>BOM0012781</BOMId>
<Name>Esko Suite 12.1 A5 Software box</Name>
<RecId>5637165603</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>G211249</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012781</BOMId>
<RecId>5637309242</RecId>
</BOM>
<BOM>
<BOMType>Item</BOMType>
<ItemId>G25583961_24</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM0012781</BOMId>
<RecId>5637309243</RecId>
</BOM>
</BOMTable>
</BOM>
</BOMTable>
</BOM>
<BOM class="entity">
<BOMId>BOM0012605</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMType>Item</BOMType>
<ItemId>9608221Z</ItemId>
<RecId>5637307758</RecId>
<UnitId>PCS</UnitId>
<InventDimBOM class="entity">
<RecId>5637213290</RecId>
</InventDimBOM>
</BOM>
<BOM class="entity">
<BOMId>BOM0012605</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMType>Item</BOMType>
<ItemId>9700624Y</ItemId>
<RecId>5637307759</RecId>
<UnitId>PCS</UnitId>
<InventDimBOM class="entity">
<RecId>5637213291</RecId>
</InventDimBOM>
<BOMTable>
<BOMId>BOM012172</BOMId>
<Name></Name>
<RecId>5637157831</RecId>
<BOM>
<BOMType>Item</BOMType>
<ItemId>9644921</ItemId>
<BOMQty>1.00</BOMQty>
<UnitId>PCS</UnitId>
<BOMId>BOM012172</BOMId>
<RecId>5637333624</RecId>
</BOM>
</BOMTable>
</BOM>
<BOM class="entity">
<BOMId>BOM0012605</BOMId>
<BOMQty>1.0000</BOMQty>
<BOMType>Item</BOMType>
<ItemId>9700815</ItemId>
<RecId>5637307760</RecId>
<UnitId>PCS</UnitId>
<InventDimBOM class="entity">
<RecId>5637213290</RecId>
</InventDimBOM>
</BOM>
</BOMTable>
<InventDim class="entity">
<RecId>5637199988</RecId>
</InventDim>
</BOMVersion>
</BillsOfMaterials>
</MessageParts>
我想创建 JSON 所有 BOM 的数组(没有层次结构的平面结构),parentId 作为父 BOM 的 RecId,如下所示 -
输出-
[
{
"id": "5637307757",
"productId": "9650092",
"parentId": null
},
{
"id": "5637307799",
"productId": "9650079",
"parentId": "5637307757"
},
{
"id": "5637307800",
"productId": "9644919T",
"parentId": "5637307757"
},
{
"id": "5637307801",
"productId": "96AR060W",
"parentId": "5637307757"
},
{
"id": "5637307802",
"productId": "9700720Z",
"parentId": "5637307757"
},
{
"id": "5637333626",
"productId": "9700595",
"parentId": "5637307802"
},
{
"id": "5637333626",
"productId": "9700595",
"parentId": "5637307802"
},
{
"id": "5637333627",
"productId": "9608224Z",
"parentId": "5637307802"
},
{
"id": "5637307803",
"productId": "9683336L",
"parentId": "5637307757"
},
{
"id": "5637309242",
"productId": "G211249",
"parentId": "5637307803"
},
{
"id": "5637309242",
"productId": "G211249",
"parentId": "5637307803"
},
{
"id": "5637309243",
"productId": "G25583961_24",
"parentId": "5637307803"
}
]
映射规则-
- id : BOM -> RecId
- productId : BOM -> ItemId
- parentId : 父BOM的RecId
与建议答案的不同之处在于,我需要使用 BOM 的直接 recid 设置 parentid,而不是 BOM table。
似乎您的输出在给定输入的情况下仍然是错误的(例如,产品 ID 96AR060W 不在输入 xml 中)。要回答您的问题而不是收集所有 BOM 对象,您可以遍历单个 BOM 对象以保存父 ID 并创建一个可以递归调用的函数。请看下面的数据编织:
%dw 2.0
output application/json
fun parseBOM(bomData, parentId) =
if (bomData.BOMTable.BOM?)
[{
id: bomData.RecId,
productId: bomData.ItemId,
parentId: parentId
}] ++ (bomData.BOMTable.*BOM flatMap parseBOM($, bomData.RecId))
else {
id: bomData.RecId,
productId: bomData.ItemId,
parentId: parentId
}
---
using (firstBOMTable = payload.MessageParts.BillsOfMaterials.BOMVersion.BOMTable)
firstBOMTable.*BOM flatMap parseBOM($, null)
鉴于您的输入 xml,这将导致
[
{
"id": "5637307757",
"productId": "9650092",
"parentId": null
},
{
"id": "5637307799",
"productId": "9650079",
"parentId": "5637307757"
},
{
"id": "5637307800",
"productId": "9644919T",
"parentId": "5637307757"
},
{
"id": "5637307801",
"productId": "9644920",
"parentId": "5637307757"
},
{
"id": "5637307802",
"productId": "9700720Z",
"parentId": "5637307757"
},
{
"id": "5637333626",
"productId": "9700595",
"parentId": "5637307802"
},
{
"id": "5637333627",
"productId": "9608224Z",
"parentId": "5637307802"
},
{
"id": "5637307803",
"productId": "9683336L",
"parentId": "5637307757"
},
{
"id": "5637309242",
"productId": "G211249",
"parentId": "5637307803"
},
{
"id": "5637309243",
"productId": "G25583961_24",
"parentId": "5637307803"
},
{
"id": "5637307758",
"productId": "9608221Z",
"parentId": null
},
{
"id": "5637307759",
"productId": "9700624Y",
"parentId": null
},
{
"id": "5637333624",
"productId": "9644921",
"parentId": "5637307759"
},
{
"id": "5637307760",
"productId": "9700815",
"parentId": null
}
]
该函数的作用是,如果提供的对象 (bomData) 包含 BOMTable.BOM,则创建所需的对象并使用其下的所有 BOM 对象再次调用相同的函数。该函数也接受 parentId 作为参数来保存它。