2016-09-16 71 views
1

我有一個XML消息,其中包含兩個用於調用REST服務端點的參數。但是,如果任何人都一定值時,我想我的電話之前改變它們,例如有效負載中的替換值

<Interface Server="ABC" Server2="DEF"/> 

如果任何這些具有值「ABC」,應該總是以「BC」,並在更換我對REST服務的調用我會在上面的例子中發送param1 =「BC」和param2 =「DEF」。 我正在考慮一個Choice路由器,並檢查Server是否爲「ABC」,然後設置一個流變量param1 =「BC」,但後來我意識到如果那個是「ABC」,我將不得不再次爲Server2做同樣的事情。 。感覺就像..它一定是一個更簡單的方法來實現這一點? 我對不對?我可以使用一些聰明的MEL或XPATH3表達式來總是將值替換爲「BC」,如果它們中的任何一個是「ABC」的話?

問候

回答

2

你可以嘗試以下配置:

<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 
) 
--- 
[email protected] mapObject { 
    ($$): substitute($) 
} 
]]></dw:set-payload> 
    </dw:transform-message> 
    <enrich source="#[payload.Server]" target="#[variable:param1]"/> 
    <enrich source="#[payload.Server2]" target="#[variable:param2]"/> 
</enricher> 

不管如何在XML源很多屬性,你只需要添加相應的富集元素。

例如,你有一個新的XML源:<Interface Server="ABC" Server2="DEF" Server3="ABC"/>

然後你只需要添加:<enrich source="#[payload.Server3]" target="#[variable:param3]"/>設置新的變量。

備註:DataWeaveEE功能之一。對於CE,您可以將其替換爲其他變壓器,例如:Groovy。在下面的例子中,有效載荷是以String的形式出現的。使用byte-array-to-string-transformer將原始應用程序/ xml格式轉換爲字符串。

<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> 
+0

不錯的辦法,我給一個去 – elwis

+0

嗯,我得到的SAXParser例外情況是,只有DataWeave - 因爲我跑CE? – elwis

+0

* DataWeave *是** EE **功能之一。我更新了使用Groovy作爲替換的答案。 –