首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空节点的数据编织错误

空节点的数据编织错误
EN

Stack Overflow用户
提问于 2015-11-25 14:42:12
回答 4查看 6.2K关注 0票数 4

我已经在dataweava中编写了如下代码

代码语言:javascript
复制
%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

        }) 
    }})}
}

}
)
}

但是,当将输入赋值为

代码语言:javascript
复制
<?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 ($ != '')的过滤器

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-11-26 00:49:14

XML输入示例

代码语言:javascript
复制
<?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打开标记和关闭标记之间有空格,您必须修复它:

代码语言:javascript
复制
<OrderLine PrimeLineNo="3" Status="Shipped3" OrderedQty="10003" ></OrderLine>

数据编织脚本

代码语言:javascript
复制
%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/否则”来验证元素的存在。

票数 2
EN

Stack Overflow用户

发布于 2015-11-27 08:34:28

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

代码语言:javascript
复制
%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                                
                        }
                    }
                )
            }
        }
    }
)
}
票数 0
EN

Stack Overflow用户

发布于 2018-01-30 20:53:16

尝试以下方法:

  • 使用"SkipNullOn“%输出应用程序/xml skipNullOn=”无处不在“
  • 您可以使用when条件,如下所示: yourField:"null“时

payload.yourField == null otherwise payload.yourField

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33919372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档