空节点的数据编织错误

Dataweave Error for Null nodes

我已经在 dataweava 中完成编码

%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

        }) 
    }})}
}

}
)
}

但是在将输入分配为

时出现错误
<?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>

这里有什么建议吗?我试过 default [] 但它不起作用。分配 null node 时出现错误。我试过过滤器 filter ($ != '')

XML 输入示例:

<?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>

注意:在你的例子中OrderLine开始标签和结束标签之间有空格,你必须修复它:

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

Dataweave 脚本:

%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 {})

          }

        })
      }


    }
  })
}

如果值不存在则无法映射,因此必须使用"when/otherwise"来验证元素是否存在。

试试这个: 这应该可以解决您的问题。 (除非not/otherwise)或(when/otherwise),可以根据您的要求使用任何组合。如果在大多数情况下存在 ShipDate,则建议使用 "Unless not",否则将 "unless not" 替换为 "when"。

%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) map {
                                    ShipDate:$.@StatusDate
                                }
                            )
                        }
                    }) unless not $.OrderLines.*OrderLine.OrderStatuses? otherwise {
                        OrderLine: {
                            EntryNumber:"abc",
                            Status:$.@Status                                
                        }
                    }
                )
            }
        }
    }
)
}

尝试以下方法:

  • 使用 "SkipNullOn" %output application/xml skipNullOn="everywhere"
  • 你可以使用 when 条件如下图 yourField: "null" when

payload.yourField == null otherwise payload.yourField

下面给出Mule Message Object的结构定义有 信息 入站 属性 出站 属性 有效载荷 多变的 流量变量 会话变量 附件 异常负载

当流的连接器(侦听端口)接收到负载时,其称为入站端点。 在流中时,我们在中间放置了一个连接器,并向其称为 Oubound 端点的负载发送有效负载。此处发送到 Http 出站流的所有出站属性都成为该流中的入站属性。

详细解释见下文link。

https://docs.mulesoft.com/mule-user-guide/v/3.8/mule-message-structure.