4

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

4

4 回答 4

2

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>

数据编织脚本

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

          }

        })
      }


    }
  })
}

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

于 2015-11-26T00:49:14.140 回答
0

试试这个: 这应该可以解决您的问题。(除非不是/否则)或(何时/否则),可以根据您的要求使用任何组合。如果在大多数情况下存在 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                                
                        }
                    }
                )
            }
        }
    }
)
}
于 2015-11-27T08:34:28.947 回答
0

尝试以下方法:

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

payload.yourField == null otherwise payload.yourField

于 2018-01-30T20:53:16.470 回答
0

下面给出Mule消息对象的结构定义有消息入站属性出站属性有效载荷变量流变量会话变量附件异常有效载荷

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

有关详细说明,请参阅下面的链接。

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

于 2018-02-26T06:32:55.503 回答