空节点的数据编织错误
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.
我已经在 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.