如何在Transform Message中动态设置SOAP请求XML参数?
解决DataWeave 2.0动态生成SOAP XML命名空间元素的问题
问题根源
你原来的代码错误在于试图通过字符串拼接"ns0#" ++ vars.operation生成带命名空间的元素名,但DataWeave中#是命名空间限定的语法符号,不能作为字符串的一部分直接拼接。这种写法会导致生成的XML元素名包含#符号(比如<ns0#Divide>),不符合XML规范,因此SOAP服务判定请求体无效。
正确的动态实现方案
使用DataWeave的动态命名空间元素语法,直接将命名空间与动态元素名结合,代码如下:
%dw 2.0 output application/xml ns ns0 http://tempuri.org/ --- { (ns0::(vars.operation)): { ns0#intA: payload.val1, ns0#intB: payload.val2 } }
如果你的操作名称是从payload中获取(参考你提供的if-else代码),只需将vars.operation替换为payload.operation:
%dw 2.0 output application/xml ns ns0 http://tempuri.org/ --- { (ns0::(payload.operation)): { ns0#intA: payload.val1, ns0#intB: payload.val2 } }
方案说明
(ns0::(动态变量))是DataWeave中定义带命名空间动态元素的标准写法,它会自动生成符合XML规范的命名空间限定元素(比如当操作是Divide时,生成<ns0:Divide xmlns:ns0="http://tempuri.org/">)。- 这个方案完全动态,新增SOAP操作时无需修改代码,比if-else逻辑简洁得多。
内容的提问来源于stack exchange,提问作者Антон Олег
相关产品推荐
相关产品推荐

