Mule 4中Transform Message/Set Payload定义XML Payload报错解决
在Transform Message组件中正确定义XML Payload并实现XML-JSON-XML转换流程
一、正确生成目标XML Payload
别直接粘贴转义后的XML字符串,用DataWeave结构化生成最稳妥,能避免转义错误和命名空间问题:
%dw 2.0 output application/xml writeDeclaration=true ns env http://schemas.xmlsoap.org/soap/enveloper/ ns wd urn:com.xyz/abcd --- env#Envelope: { env#Body: { wd#GetMappingTable @(wd#version: "v40.0"): { wd#RequestRef: { wd#MappingRef: { wd#MappingId @(wd#type: "Integration_Mapping_ID"): "ACCOUNT_MP" } }, wd#ResponseFil: { wd#page: 1, wd#count: 10 } } } }
关键说明:
writeDeclaration=true会自动生成XML声明头,和原XML格式一致ns定义命名空间缩写,对应原XML里的env和wd,URI要完全匹配(注意原XML里的enveloper别写成envelope)- 用
#关联命名空间和元素,@()用来处理XML属性
如果非要用字符串形式,把转义符还原后用"""包裹多行内容:
%dw 2.0 output application/xml --- """ <?xml version="1.0" encoding="UTF-8"?> <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/enveloper/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <env:Body> <wd:GetMappingTable xmlns:wd="urn:com.xyz/abcd" wd:version="v40.0"> <wd:RequestRef> <wd:MappingRef> <wd:MappingId wd:type="Integration_Mapping_ID">ACCOUNT_MP</wd:MappingId> </wd:MappingRef> </wd:RequestRef> <wd:ResponseFil> <wd:page>1</wd:page> <wd:count>10</wd:count> </wd:ResponseFil> </wd:GetMappingTable> </env:Body> </env:Envelope> """
二、实现XML转JSON再转回XML的完整流程
按以下顺序配置Mule流组件:
- Transform Message:用上面的DataWeave代码生成原始XML
- Transform Message:转成JSON
%dw 2.0 output application/json --- payload - Transform Message:转回XML(要保证结构和原XML一致,推荐手动映射)
如果不需要严格匹配属性,也可以直接用%dw 2.0 output application/xml writeDeclaration=true ns env http://schemas.xmlsoap.org/soap/enveloper/ ns wd urn:com.xyz/abcd --- env#Envelope: { env#Body: { wd#GetMappingTable @(wd#version: payload.Envelope.Body.GetMappingTable."@wd:version"): { wd#RequestRef: { wd#MappingRef: { wd#MappingId @(wd#type: payload.Envelope.Body.GetMappingTable.RequestRef.MappingRef.MappingId."@wd:type"): payload.Envelope.Body.GetMappingTable.RequestRef.MappingRef.MappingId } }, wd#ResponseFil: { wd#page: payload.Envelope.Body.GetMappingTable.ResponseFil.page as Number, wd#count: payload.Envelope.Body.GetMappingTable.ResponseFil.count as Number } } } }payload自动转换,但可能丢失命名空间属性,不推荐。 - HTTP Requester:发送最终XML,记得设置请求头
Content-Type: application/xml
常见错误排查
- 命名空间URI写错:原XML里的
http://schemas.xmlsoap.org/soap/enveloper/末尾是enveloper,别写成envelope - 转义字符残留:直接粘贴带
</>的XML会导致解析失败,必须还原或用结构化生成 - 属性处理错误:XML属性要在DataWeave里用
@()定义,不能当成元素内容
内容的提问来源于stack exchange,提问作者Devendra
相关产品推荐
相关产品推荐

