【问题标题】:how to add a node in a xml payload in mule如何在 mule 的 xml 有效负载中添加节点
【发布时间】:2018-02-09 14:51:33
【问题描述】:

我想在 mule 的 xml 有效负载中添加一个节点。有人可以告诉我怎么做。 输入xml --

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

没有任何工作..请帮助!!!

【问题讨论】:

    标签: xml mule payload


    【解决方案1】:

    您可以使用 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>  
    

    如您所见,您需要首先使用 XPATH3 从输入 XML 中提取 cde 的值并将其存储到变量中。您还可以将 id 值存储到变量中..

    最后,您可以使用给定的 XSLT 修改 XML,并将所有变量值传递给它,如上所示。

    更新答案

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

    【讨论】:

    • 现在我必须使用浓缩器。我试过 -----
    • 知道了——异常堆栈是:1. 位置 (com.thoughtworks.xstream.mapper.CannotResolveClassException) com.thoughtworks.xstream.mapper.DefaultMapper:79 (null) 2. 位置 (com. thinkworks.xstream.mapper.CannotResolveClassException)。消息负载的类型为:String (org.mule.api.transformer.TransformerMessagingException)
    • 很好,您可以在 &lt;http:request/&gt; 之前在浓缩器中使用此代码它将起作用.. 我从您的流程中了解到,您需要使用此附加元素发布 XML .. 对? ..您可以按照我之前向您展示的方式在浓缩器中进行操作&lt;http:request/&gt;.. 只需确保将&lt;processor-chain/&gt; 放入浓缩器中
    • 检查更新的答案 .. 相同的代码将放在具有处理器链的丰富器下,在您的 &lt;http:request/&gt; 之前
    • 您正确地符合要求。但是我需要使用丰富器在 xml 有效负载中添加一个节点,但要避免使用 xslt。类似于我在这里粘贴的代码。知道如何使它工作吗?
    【解决方案2】:

    对于您的表达式组件解决方案,请尝试使用 xml-to-dom-transformer 并在组件之后使用相反的转换器。

    另一个干净的解决方案是使用 XSLT 的 identity transformation(添加 id)。

    最后,如果您使用的是 Mule EE DaveWeave 甚至更好。

    【讨论】:

    • 试过 得到消息:执行表达式“bNode= message.payload.rootElement.addElement('ID');...失败。有效负载:org.dom4j.tree.DefaultDocument@40a7b [文档:name null] 异常堆栈是:[错误:无法解析的属性或标识符:'ID] [Near:{..tElement.addElement('ID');.}]
    • XSLT 是适合这项工作的工具。查看用户指南:developer.mulesoft.com/docs/display/current/XSLT+Transformer 它显示了如何将值从流传递到 XSL 模板。
    • @Victor 现在我必须使用浓缩器来完成。我试过 -----
    • 知道了——异常堆栈是:1. 位置 (com.thoughtworks.xstream.mapper.CannotResolveClassException) com.thoughtworks.xstream.mapper.DefaultMapper:79 (null) 2. 位置 (com. thinkworks.xstream.mapper.CannotResolveClassException)。消息负载的类型为:String (org.mule.api.transformer.TransformerMessagingException)
    • 我不明白,已经有一个接受的答案。有效吗?
    【解决方案3】:

    我可以通过使用 groovy 来做到这一点

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多