MuleSoft DataWeave遍历订单行异常:仅插入一条订单行求助
排查DataWeave遍历XML订单行仅返回一条的问题
我刚看了你的问题和代码,问题出在遍历的节点层级不对,导致只处理了第一个订单行。咱们一步步来理清楚:
问题分析
你的输入XML里,<product-lineitems>是一个包含多个<product-lineitem>的父节点,而你的代码里是对payload.*ns0#order.ns0#"product-lineitems"做map遍历——但这个节点本身只有一个,所以map只会执行一次。然后你在map里取e.ns0#"product-lineitem".ns0#"product-id",当有多个<product-lineitem>时,这个表达式默认只会取第一个节点的值,所以最终只生成了一条订单行记录。
修正后的DataWeave代码
%dw 2.0 output application/java ns ns0 http://www.demandware.com/xml/impex/order/2006-10-31 --- [ { Order_Confirmation_Number__c: payload.ns0#order.ns0#"order-no", // 原代码里的current-order-no在输入XML里是order-no,这里顺手修正 "attributes": { "type": "PBSI__PBSI_Sales_Order__c", "referenceId": "SO" }, "PBSI__Sales_Order_Lines__r": { "records": payload.ns0#order.ns0#"product-lineitems".*ns0#"product-lineitem" map((lineItem, index) -> { "attributes": { "type": "PBSI__PBSI_Sales_Order_Line__c", "referenceId": "SOL_$(index)" // 给referenceId加索引,避免重复 }, "PBSI__Item__c": "a0a1x000001PfWa", "PBSI__ItemDescription__c": lineItem.ns0#"product-id" }) } } ]
关键修改点
- 遍历节点调整:把原来遍历
product-lineitems改成直接遍历product-lineitems下的所有product-lineitem节点,用.*ns0#"product-lineitem"来获取这个节点集合,这样每个订单行都会被处理。 - referenceId优化:给销售订单行的referenceId加上索引
$(index),避免多个行的referenceId重复(这可能会导致后续对接系统的异常)。 - 订单编号修正:原代码里的
current-order-no在你的输入XML里实际是order-no,这里也一起修正了,避免取值为空。
验证要点
运行修正后的代码后,应该能生成两条PBSI__Sales_Order_Line__c类型的记录,分别对应输入XML里的两个product-lineitem节点。
内容的提问来源于stack exchange,提问作者Pankaj Mishra
相关产品推荐
相关产品推荐

