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

如何在DataWeave 2.0中获取特定属性值的第二个XML元素

DataWeave 2.0提取指定XML元素问题解决

问题描述

使用MuleSoft DataWeave 2.0处理XML payload时,需要提取属性wd:type等于Learning_Course_ID的第二个<wd:ID>元素,但现有脚本返回null。

示例XML输入

<?xml version='1.0' encoding='UTF-8'?>
<wd:Report_Data xmlns:wd="urn:com.test.report/test">
    <wd:Report_Entry>
        <wd:Worker_group>
            <wd:user_email>test@gmail.com</wd:user_email>
        </wd:Worker_group>
        <wd:course_id wd:Descriptor="Preventing bribery, fraud and money laundering">
            <wd:ID wd:type="WID">dummysdfg</wd:ID>
            <wd:ID wd:type="Learning_Course_ID">MANUAL_COURSE-1-16</wd:ID>
            <wd:ID wd:type="Learning_Course">Preventing bribery, fraud and money laundering</wd:ID>
        </wd:course_id>
    </wd:Report_Entry>
</wd:Report_Data>

尝试的DataWeave脚本

%dw 2.0
output application/json
ns wd urn:com.test.report/test

---

{
  secondLearningCourseID: 
    payload.wd#Report_Data.wd#Report_Entry.wd#course_id."wd:ID" 
      filter ((item) -> item.@"type" == "Learning_Course_ID")[1] 
}

错误结果

{
"secondLearningCourseID": null
}

问题分析与解决

错误原因

  1. 属性引用错误:XML中的属性是带命名空间的wd:type,脚本中用item.@"type"无法正确访问该属性,导致过滤条件不成立,最终得到空数组,取索引[1]自然返回null。
  2. 索引逻辑错误:示例中仅存在一个wd:type为Learning_Course_ID的<wd:ID>元素,即使过滤条件正确,索引[1]也超出了数组范围(数组索引从0开始,第一个元素索引为0)。

正确脚本

场景1:提取所有wd:type为Learning_Course_ID的<wd:ID>中的第二个元素(适用于存在多个符合条件的场景)

如果实际数据中有多个符合条件的元素,使用以下脚本,并处理不存在第二个元素的情况:

%dw 2.0
output application/json
ns wd urn:com.test.report/test
---
{
  secondLearningCourseID: (payload.wd#Report_Data.wd#Report_Entry.wd#course_id."wd:ID" 
    filter ((item) -> item.@"wd:type" == "Learning_Course_ID"))[1] default "无符合条件的第二个元素"
}

场景2:提取<wd:course_id>下的第二个<wd:ID>元素(恰好其wd:type为Learning_Course_ID)

如果需求实际是取第二个<wd:ID>元素(不管属性,但示例中该元素正好符合属性条件),使用以下脚本:

%dw 2.0
output application/json
ns wd urn:com.test.report/test
---
{
  secondLearningCourseID: payload.wd#Report_Data.wd#Report_Entry.wd#course_id."wd:ID"[1]
}

场景3:确保提取的第二个元素符合属性条件

如果需要验证第二个<wd:ID>的wd:type确实是Learning_Course_ID,可以添加条件判断:

%dw 2.0
output application/json
ns wd urn:com.test.report/test
---
{
  secondLearningCourseID: do {
    var secondID = payload.wd#Report_Data.wd#Report_Entry.wd#course_id."wd:ID"[1]
    ---
    if (secondID.@"wd:type" == "Learning_Course_ID") secondID else "第二个元素不符合属性条件"
  }
}

补充说明

  • XML属性带有命名空间时,必须通过@"命名空间:属性名"或@命名空间::属性名的方式访问,比如item.@"wd:type"或item.@wd::type。
  • DataWeave中数组索引从0开始,第一个元素索引为0,第二个为1,以此类推。
  • 使用default关键字可以处理数组索引超出范围的情况,避免返回null。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:50:10