I have a requirement to convert xml to csv file, however I need to follow following points
- In case of nested tags, the output should have all the nested tags key with . separated.
example: ReferenceNums.Reference
<ReferenceNums>
<Reference type="shiprefnum">124215133</Reference>
</ReferenceNums>
- The xml file has header and details, the csv file should have same number of rows as per details and header values will be repeated for each detail line.
Sample XML:
<?xml version='1.0' encoding='UTF-8'?>
<LeanXML batchref="583628866.tiff" created="201801160501">
<DocumentUpload>
<ShipperRef>12358673_SF_00010</ShipperRef>
<ReferenceNums>
<Reference type="shiprefnum">124215133</Reference>
</ReferenceNums>
<ChargeHeader>
<CurrencyCode>USD</CurrencyCode>
<NetTotal>500.00</NetTotal>
<ChargeDetails>
<ChargeDetail ChargeCodeID="BAS" Description="BASIS ITEM">
<Net>500.00</Net>
</ChargeDetail>
</ChargeDetails>
</ChargeHeader>
<Equipment code="53V" type="Van">53 VAN</Equipment>
<OrderLineItems>
<OrderLineItem>
<ProductID>951-000433-001</ProductID>
<Barcode>0192472022595</Barcode>
</OrderLineItem>
<OrderLineItem>
<ProductID>951-000433-002</ProductID>
<Barcode>0192472022593</Barcode>
</OrderLineItem>
</OrderLineItems>
</DocumentUpload>
</LeanXML>
Expected output
ShipperRef|ShipmentLegSeq|ReferenceNums.Reference.shiprefnum|ChargeHeader.CurrencyCode|ChargeHeader.NetTotal|ChargeHeader.ChargeDetails.ChargeDetail.ChargeCodeID|ChargeHeader.ChargeDetails.ChargeDetail.Description|ChargeHeader.ChargeDetails.ChargeDetail.Net|Equipment|OrderLineItems.OrderLineItem.ProductID|OrderLineItems.OrderLineItem.Barcode
12358673_SF_00010||124215133|USD|500.00|BAS|BASIS ITEM|500.00|53 VAN|951-000433-001|0192472022595
12358673_SF_00010||124215133|USD|500.00|BAS|BASIS ITEM|500.00|53 VAN|951-000433-002|0192472022593
Code I tried:
%dw 2.0
output application/csv separator='|'
---
payload.LeanXML.*DocumentUpload flatMap (item) -> item.OrderLineItems.*OrderLineItem map (item1) ->
{ShipperRef: item.ShipperRef,
ShipmentLegSeq: item.ShipmentLegSeq,
(item.ReferenceNums mapObject ((value, key) -> {
("ReferenceNums." ++ key ++ "." ++ (key[@'type']) ) : value
})),
(item.Carrier mapObject ((value, key) -> {
("Carrier." ++ key ) : value
})),
(item.ChargeHeader mapObject ((value, key) -> {
("ChargeHeader." ++ key ) : value
})),
"Equipment": item.Equipment,
"OrderLineItems.OrderLineItem.ProductID": item1.ProductID,
"OrderLineItems.OrderLineItem.Barcode": item1.Barcode,
}