Search code examples
mulemule-studiomule-componentmule-eldataweave

Dataweave Error for Null nodes


I have done coding in dataweava as

%dw 1.0
%input payload application/xml
%output application/xml skipNullOn="everywhere"
---
{((payload.*Order default []) map {
Order:{
    Channel:$.@EnterpriseCode,
    Code:$.@OrderNo,
    Status:$.@Status,
    OrderLines: {
    (($.OrderLines.*OrderLine default []) map {
    OrderLine:{
        EntryNumber:"abc",
        Status:$.@Status,

        (($.OrderStatuses.*OrderStatus default []) map {

        ShipDate:$.@StatusDate

        }) 
    }})}
}

}
)
}

But its giving error when assigning input as

<?xml version="1.0" encoding="UTF-8"?>
<Order EnterpriseCode="111" OrderNo="222" Status="Scheduled">
    <OrderLines>
        <OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000">

        </OrderLine>
    </OrderLines>
</Order>

Any suggestions here? I have tried default [] but its not working. When assigning null node its giving error. I have tried filter as filter ($ != '')


Solution

  • XML input example:

    <?xml version="1.0" encoding="UTF-8"?>
    <Order EnterpriseCode="111" OrderNo="222" Status="Scheduled">
      <OrderLines>
        <OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000">
           <OrderStatuses>
              <OrderStatus StatusDate="statusDate"></OrderStatus>
              <OrderStatus StatusDate="statusDate"></OrderStatus>
          </OrderStatuses>
        </OrderLine>
        <OrderLine PrimeLineNo="3" Status="Shipped3" OrderedQty="10003" ></OrderLine>
      </OrderLines>
    </Order>
    

    Note: In your example there are spaces between OrderLine open tag and close tag, you have to fix it:

    <OrderLine PrimeLineNo="3" Status="Shipped3" OrderedQty="10003" ></OrderLine>
    

    Dataweave script:

    %input payload application/xml
    %output application/xml skipNullOn="everywhere"
    ---
    {
      ((payload.*Order default []) map {
        Order:{
          Channel:$.@EnterpriseCode,
          Code:$.@OrderNo,
          Status:$.@Status,
    
          OrderLines: {
            (($.OrderLines.*OrderLine default []) map {
    
              OrderLine:{
                EntryNumber:"abc",
                Status:$.@Status, 
    
                (($.OrderStatuses.*OrderStatus default []) map ((key,pos) -> {
                    ShipDate:key.@StatusDate
                }) when $!='' otherwise {})
    
              }
    
            })
          }
    
    
        }
      })
    }
    

    You can't map a value if it doesn't exist, so you have to use "when/otherwise" to verify the existence of the elements.