2016-09-16 2 views
1

У меня есть XML-сообщение с двумя параметрами, которые я использую для вызова конечной точки службы REST. Однако, если любой из них определенное значение, я хотел бы изменить их до моего звонка, напримерЗамените значения в полезной нагрузке

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

Если какой-либо из тех, кто имеет значение «ABC» он всегда должен быть заменен на «до нашей эры» и в мой вызов службы REST я бы отправил param1 = "BC" и param2 = "DEF" в приведенном выше примере. Я думал о маршрутизаторе «Выбор» и проверял, является ли Сервер «ABC», затем установите переменную потока param1 = «BC», но затем я понял, что мне придется сделать то же самое снова для Server2, если это «ABC» .. и это похоже на ... это должен быть более простой способ достичь этого? Я прав? Могу ли я использовать какое-то умное выражение 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]"/> установить новую переменную.

Примечания: DataWeave является одним из функций EE. Для CE вы можете заменить его другим трансформатором, например: Groovy. В приведенном ниже примере полезная нагрузка находится в форме String. Исходный формат application/xml преобразуется в String с использованием 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> 
+0

Хороший подход, я дам, что идти – elwis

+0

Хм, я получаю SAXParser исключение, является то, что DataWeave только - так я бегу CE? – elwis

+0

* DataWeave * - одна из функций ** EE **. Я обновил свой ответ для использования Groovy в качестве замены. –

Смежные вопросы