如何在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 }
问题分析与解决
错误原因
- 属性引用错误:XML中的属性是带命名空间的
wd:type,脚本中用item.@"type"无法正确访问该属性,导致过滤条件不成立,最终得到空数组,取索引[1]自然返回null。 - 索引逻辑错误:示例中仅存在一个
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
相关产品推荐
相关产品推荐

