【问题标题】:Dataweave Error for Null nodesNull 节点的 Dataweave 错误
【发布时间】:2016-02-28 09:53:25
【问题描述】:

我在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 ($ != '')

【问题讨论】:

  • 请提供示例输入输出数据。
  • 它给出了什么错误?是Cannot coerce a :null to a :array (com.mulesoft.weave.mule.exception.WeaveExecutionException). Message payload is of type: LinkedList 吗?

标签: mule mule-studio mule-component mule-el dataweave


【解决方案1】:

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

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

详细解释见下面的链接。

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

【讨论】:

    【解决方案2】:

    尝试以下方法:

    • 使用“SkipNullOn”%输出应用程序/xml skipNullOn="everywhere"
    • 可以使用如下所示的when条件yourField: "null" when

    payload.yourField == null otherwise payload.yourField

    【讨论】:

      【解决方案3】:

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

      如果值不存在,则无法映射,因此必须使用“何时/否则”来验证元素的存在。

      【讨论】:

      • 嗨,Davo,我尝试了这段代码,但通过提供此输入 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;Order EnterpriseCode="111" OrderNo="222" Status="Scheduled"&gt; &lt;OrderLines&gt; &lt;OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000"&gt; &lt;/OrderLine&gt; &lt;/OrderLines&gt; &lt;/Order&gt; 仍然给出错误
      • 好的,我用这样的空 OrderLine 构建了脚本: 带有内联关闭标签。
      • 我提供的输入还有其他选项吗?
      • 是的,它的工作原理.. 但是如果有人有不同的要求,它会根据那个改变。谢谢达沃
      • +1 for 'You can't map a value if it doesn't exist' ,当您在字段名称中有拼写错误时,您将收到以下错误消息:Cannot coerce a :null to ...
      【解决方案4】:

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

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

      【讨论】:

      • 嗨 J J,这段代码看起来很适合单次迭代 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;Order EnterpriseCode="111" OrderNo="222" Status="Scheduled"&gt; &lt;OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000"&gt; &lt;/OrderLine&gt; &lt;/OrderLines&gt; &lt;/Order&gt; 但是对于 orderline 的迭代元素,代码是否失败
      • 输入&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;Order EnterpriseCode="111" OrderNo="222" Status="Scheduled"&gt; &lt;OrderLines&gt; &lt;OrderLine PrimeLineNo="1" Status="Released" OrderedQty="70"&gt; &lt;OrderStatuses&gt; &lt;OrderStatus StatusDate="Shipped Date"/&gt; &lt;/OrderStatuses&gt; &lt;/OrderLine&gt; &lt;OrderLine PrimeLineNo="2" Status="Shipped" OrderedQty="1000"&gt; &lt;/OrderLine&gt; &lt;/OrderLines&gt; &lt;/Order&gt;失败
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2014-09-22
      • 1970-01-01
      • 2017-12-01
      • 2017-10-05
      • 2018-11-29
      • 1970-01-01
      相关资源
      最近更新 更多