user12277274
user12277274

Reputation: 109

Converting XML to CSV using dataweave

I have a requirement to convert xml to csv file, however I need to follow following points

  1. 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>
  1. 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,

}

Upvotes: -1

Views: 44

Answers (0)

Related Questions