2015-07-16 2 views
0

Я хочу добавить узел в свою полезную нагрузку xml в муле. Может кто-нибудь покажет мне, как это сделать. Входной XML -Как добавить узел в полезную нагрузку xml в mule

<Location> 
    <cde> Hello </cde> 
</Location> 

Я хочу, чтобы добавить узел после

Результат XML изгоняются быть, как это -

<Location> 
<id> 1234 </id>  
<cde> Hello </cde> 
</Location> 

Я попытался

<expression-component><![CDATA[ 
    myNode = message.payload.rootElement.addElement(’ID’); 
    myNode.text = '1234'; 
    message.payload.rootElement.elements().add(1, myNode.detach()); 
]]></expression-component> 

также

<enricher source="#[sessionVars.providerid]" doc:name="Message Enricher" 
target="#[xpath3(’/Locations’,payload,’NODE’).appendChild(payload.importNode($.getFirstChild(),true))]"> 

<http:request config-ref="HTTP_Request_Configuration" path="/system" method="POST" doc:name="HTTP"/> 
</enricher> 

ничего не работает. Пожалуйста, помогите !!!

ответ

0

Вы можете использовать XSLT добавить узел или изменить XML следующим способом: -

<http:listener-config name="HTTP_Listener_Configuration" host="localhost" port="8082" basePath="rc" doc:name="HTTP Listener Configuration"/> 
    <flow name="test"> 
    <http:listener config-ref="HTTP_Listener_Configuration" path="/myservice" doc:name="HTTP"/> 
    <set-variable variableName="Cde" value="#[xpath3('//Location/cde')]" doc:name="Variable"/> 
    <logger level="INFO" message="Cde :-#[flowVars.Cde]" doc:name="Logger"/> 
    <set-variable variableName="Id" value="1324" doc:name="Variable"/> 
    <mulexml:xslt-transformer name="PrepareSOAPRequest" xsl-file="Transform.xsl" outputEncoding="UTF-8" encoding="UTF-8" maxIdleTransformers="2" maxActiveTransformers="5" returnClass="java.lang.String" doc:name="XSLT"> 
     <mulexml:context-property key="Cde" value="#[flowVars.Cde]"/> <!-- Passing the variables in XSLT to produce the XML dynamically --> 
     <mulexml:context-property key="Id" value="#[flowVars.Id]"/> <!-- Passing the variables in XSLT to produce the XML dynamically --> 
    </mulexml:xslt-transformer>  
    <logger level="INFO" message="Final XML :-#[message.payload]" doc:name="Logger"/> 
    </flow> 

И ваш XSLT будет выглядеть следующим образом и должны быть поставлены под src/main/resource папку: -

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes" /> 
    <!-- Getting values from Mule variables --> 
    <xsl:param name="Cde"/> 
    <xsl:param name="Id"/> 

<xsl:template match="/"> 
    <Location>  
<id><xsl:value-of select="$Id"/></id> 
<cde><xsl:value-of select="$Cde"/></cde> 
</Location> 
</xsl:template> 
</xsl:stylesheet> 

Как вы можете видеть, что вы должны сначала экстракт значение CDE из вашего ввода XML, используя XPATH3 и сохраняя его в переменной. Вы также можете хранить ID значение в переменную ..

Наконец, вы можете изменить XML с помощью XSLT как данность, и передавая все переменные значения в нем, как показано выше.

ОБНОВЛЕНО ОТВЕТ

<enricher source="#[message.payload]" target="#[flowVars.test]"> 
    <processor-chain> 
    <set-payload value="&lt;Location&gt;&lt;cde&gt; Hello &lt;/cde&gt;&lt;/Location&gt;" doc:name="Set Payload" /> 
    <set-variable variableName="Cde" value="#[xpath3('//Location/cde')]" doc:name="Variable" /> 
    <logger level="INFO" message="Cde :-#[flowVars.Cde]" doc:name="Logger" /> 
    <set-variable variableName="Id" value="1324" doc:name="Variable" /> 
    <mulexml:xslt-transformer name="PrepareSOAPRequest" xsl-file="Transform.xsl" outputEncoding="UTF-8" encoding="UTF-8" maxIdleTransformers="2" maxActiveTransformers="5" returnClass="java.lang.String" 
        doc:name="XSLT"> 
     <mulexml:context-property key="Cde" value="#[flowVars.Cde]" /> <!-- Passing the variables in XSLT to produce the XML dynamically --> 
     <mulexml:context-property key="Id" value="#[flowVars.Id]" /> <!-- Passing the variables in XSLT to produce the XML dynamically --> 
    </mulexml:xslt-transformer> 
    <logger level="INFO" message="Final XML :-#[message.payload]" doc:name="Logger" /> 
    <http:request config-ref="HTTP_Request_Configuration" path="/system" method="POST" doc:name="HTTP"/> 
    </processor-chain> 
</enricher> 
+0

Спасибо @Anirban. это прекрасно работает. –

+0

Теперь я должен сделать это, используя обогатителя. Я пытался -----

+0

Получил this-- стек исключения: 1. Места (com.thoughtworks.xstream.mapper.CannotResolveClassException) com.thoughtworks.xstream.mapper.DefaultMapper : 79 (null) 2. Местоположения (com.thoughtworks.xstream.mapper.CannotResolveClassException). Полезная нагрузка сообщения имеет тип: String (org.mule.api.transformer.TransformerMessagingException) –

0

Для вашего решения компонент выражения попробуйте использовать xml-to-dom-transformer, а после компонента - противоположный трансаформатор.

Другим чистым решением будет identity transformation (добавление идентификатора) с использованием XSLT.

Наконец, если вы используете Mule EE < 3.7, это очень простая задача для DataMapper, или даже лучше для DaveWeave, если на 3.7.

+0

Пробовал <выражение-компонент> Got-Message: Выполнение выражения "bNode = message.payload.rootElement.addElement ('ID'); .. . Полезная нагрузка: org.dom4j.tree.DefaultDocument @ 40a7b [Document: name null] Исключительный стек: [Ошибка: неразрешимое свойство или идентификатор: 'ID] [Near: {.. tElement.addElement (' ID ') ;.}] –

+0

Похоже, вы используя неправильный тип цитаты –

+0

XSLT - это правильный инструмент для работы. Проверьте руководство пользователя: https://developer.mulesoft.com/docs/display/current/XSLT+Transformer. Он показывает, как передавать значения из потока в шаблон XSL. –

0

Я был в состоянии сделать это с помощью заводной

<enricher target="#[flowVars['compliant']]" doc:name="Message Enricher"> 
      <flow-ref name="lookupComplaintData" doc:name="lookupComplaintData"/> 

     </enricher> 

<set-payload value="#[flowVars.compliant]" doc:name="Set Payload"/> 

<sub-flow doc:description="add Compliant information " 
     name="lookupComplaintData"> 
     <scripting:transformer doc:name="Groovy"> 
      <scripting:script engine="Groovy"><![CDATA[import org.dom4j.* 
import groovy.xml.DOMBuilder 
import groovy.xml.dom.DOMCategory 

Element compliantElement = payload.getRootElement().addElement("compliant") 
compliantElement.addElement("compliantType").addText("Delivery") 
compliantElement.addElement("compliantReference").addText("ABC123ABC") 
compliantElement.addElement("complaintText").addText("Order was delivered on time") 

return payload 
]]></scripting:script> 
     </scripting:transformer> 
Смежные вопросы