替换负载中的值
Substitute values in payload
我有一个 XML 消息,其中有两个参数,我用它来调用 REST 服务端点。但是,如果它们中的任何一个是某个值,我想在调用之前更改它们,例如
<Interface Server="ABC" Server2="DEF"/>
如果其中任何一个具有值 "ABC",则应始终将其替换为 "BC",并且在我对 REST 服务的调用中,我将发送 param1="BC" 和 param2="DEF" 在上面的例子中。
我在考虑一个 Choice 路由器并检查 Server 是否为 "ABC" 然后设置一个流变量 param1="BC" 但后来我意识到如果 Server2 是 "ABC" ...感觉就像..它一定是实现此目标的更简单方法吗?
我对吗?我可以使用一些聪明的 MEL 或 XPATH3 表达式来始终将值替换为 "BC" 如果它们中的任何一个是 "ABC"?
此致
您可以尝试以下配置:
<enricher doc:name="Message Enricher">
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/java
%var evaluation = "ABC"
%var substitution = "BC"
%function substitute(serverVal)(
serverVal when serverVal != evaluation otherwise substitution
)
---
payload.Interface.@ mapObject {
($$): substitute($)
}
]]></dw:set-payload>
</dw:transform-message>
<enrich source="#[payload.Server]" target="#[variable:param1]"/>
<enrich source="#[payload.Server2]" target="#[variable:param2]"/>
</enricher>
无论您的 XML 源中有多少属性,您只需要相应地添加 enricher 元素。
例如,您有一个新的 XML 来源:<Interface Server="ABC" Server2="DEF" Server3="ABC"/>
那么你只需要添加:<enrich source="#[payload.Server3]" target="#[variable:param3]"/>
来设置新的变量。
注意:DataWeave 是 EE 的功能之一。对于CE,可以换成其他变压器,例如:Groovy。在下面的示例中,有效负载采用字符串形式。使用 byte-array-to-string-transformer
.
将原始 application/xml 格式转换为 String
<scripting:component doc:name="Groovy">
<scripting:script engine="Groovy"><![CDATA[def attributeMap = new XmlSlurper().parseText(payload).attributes()
attributeMap.each() {
it.value = it.value == "ABC" ? "BC" : it.value
}
payload = attributeMap]]></scripting:script>
</scripting:component>
我有一个 XML 消息,其中有两个参数,我用它来调用 REST 服务端点。但是,如果它们中的任何一个是某个值,我想在调用之前更改它们,例如
<Interface Server="ABC" Server2="DEF"/>
如果其中任何一个具有值 "ABC",则应始终将其替换为 "BC",并且在我对 REST 服务的调用中,我将发送 param1="BC" 和 param2="DEF" 在上面的例子中。 我在考虑一个 Choice 路由器并检查 Server 是否为 "ABC" 然后设置一个流变量 param1="BC" 但后来我意识到如果 Server2 是 "ABC" ...感觉就像..它一定是实现此目标的更简单方法吗? 我对吗?我可以使用一些聪明的 MEL 或 XPATH3 表达式来始终将值替换为 "BC" 如果它们中的任何一个是 "ABC"?
此致
您可以尝试以下配置:
<enricher doc:name="Message Enricher">
<dw:transform-message doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%output application/java
%var evaluation = "ABC"
%var substitution = "BC"
%function substitute(serverVal)(
serverVal when serverVal != evaluation otherwise substitution
)
---
payload.Interface.@ mapObject {
($$): substitute($)
}
]]></dw:set-payload>
</dw:transform-message>
<enrich source="#[payload.Server]" target="#[variable:param1]"/>
<enrich source="#[payload.Server2]" target="#[variable:param2]"/>
</enricher>
无论您的 XML 源中有多少属性,您只需要相应地添加 enricher 元素。
例如,您有一个新的 XML 来源:<Interface Server="ABC" Server2="DEF" Server3="ABC"/>
那么你只需要添加:<enrich source="#[payload.Server3]" target="#[variable:param3]"/>
来设置新的变量。
注意:DataWeave 是 EE 的功能之一。对于CE,可以换成其他变压器,例如:Groovy。在下面的示例中,有效负载采用字符串形式。使用 byte-array-to-string-transformer
.
<scripting:component doc:name="Groovy">
<scripting:script engine="Groovy"><![CDATA[def attributeMap = new XmlSlurper().parseText(payload).attributes()
attributeMap.each() {
it.value = it.value == "ABC" ? "BC" : it.value
}
payload = attributeMap]]></scripting:script>
</scripting:component>