You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历XML属性并更新指定节点值?DataWeave代码求助

修正DataWeave代码实现XML特定节点值替换

输入XML示例

<Root>
  <ReferenceNums>
    <Reference type="shiprefnum">原参考编号</Reference>
    <Reference type="orderref">ORD-12345</Reference>
  </ReferenceNums>
  <AdditionalInfo>
    <Detail>示例内容</Detail>
  </AdditionalInfo>
</Root>

期望输出XML示例

<Root>
  <ReferenceNums>
    <Reference type="shiprefnum">124215133_AB_00010</Reference>
    <Reference type="orderref">ORD-12345</Reference>
  </ReferenceNums>
  <AdditionalInfo>
    <Detail>示例内容</Detail>
  </AdditionalInfo>
</Root>

正确DataWeave代码(Mule 4+)

使用update操作符的简洁实现:

%dw 2.0
output application/xml
---
payload update {
    // 定位到所有ReferenceNums下的Reference节点
    case targetRef at .ReferenceNums.Reference 
    // 判断节点的type属性是否为shiprefnum
    when targetRef.@type == "shiprefnum" -> 
        // 替换节点的文本值,保留原有属性
        targetRef update { case value at $ -> "124215133_AB_00010" }
}

也可以用mapObject遍历实现(适合复杂层级场景):

%dw 2.0
output application/xml
---
payload mapObject (nodeVal, nodeKey) -> 
    if (nodeKey == "ReferenceNums") 
        // 遍历ReferenceNums下的所有子节点
        nodeVal mapObject (refVal, refKey) -> 
            if (refKey == "Reference" and refVal.@type == "shiprefnum") 
                // 替换目标节点值,保留原有属性
                { Reference @(refVal.@): "124215133_AB_00010" }
            else 
                // 保留其他节点不变
                { (refKey): refVal }
    else 
        // 保留其他顶层节点不变
        { (nodeKey): nodeVal }

常见问题排查

  • 节点路径错误:确认XML层级是否和代码中的.ReferenceNums.Reference一致,比如如果ReferenceNums嵌套在其他节点下,需要补全路径(如.ParentNode.ReferenceNums.Reference)。
  • 属性判断遗漏:如果代码没加targetRef.@type == "shiprefnum"的判断,会替换所有Reference节点的值。
  • 丢失节点属性:替换时如果直接写{ Reference: "新值" }会丢失原有type属性,必须用@(refVal.@)继承所有原有属性。

内容的提问来源于stack exchange,提问作者user12277274

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 15:55:02