【问题标题】:extract particular xml nodes from xml list in mulesoft从 mulesoft 中的 xml 列表中提取特定的 xml 节点
【发布时间】:2017-11-03 05:34:48
【问题描述】:

我有一个下面的 xml 请求

<root>
<base>
<status>
<type>A</type>
<set>B</set>
</status>
<status>
<type>A</type>
<set>B</set>
</status>
<status>
<type>A</type>
<set>B</set>
</status>
</root>
</base>

我想从上面的xml中提取下面的xml

<status>
<type>A</type>
<set>B</set>
</status>
<status>
<type>A</type>
<set>B</set>
</status>
<status>
<type>A</type>
<set>B</set>
</status>

**我不想使用 dataweave ,如何通过 xpath 表达式实现这个逻辑,让我用其他方法来实现它**

【问题讨论】:

  • 提问前有没有搜索过解决方案?我想没有...

标签: xml xpath mule mule-esb


【解决方案1】:

请注意您的输入 xml 无效,请修复根和基本标记以使其有效

#Solution1 由于您还没有准备好使用 Dataweave 下面是另一个使用 xslt 转换器和您需要的 XPath:-:-

   <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>

      <flow name="testFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/>
         <mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
        <logger message="input xml:- #[payload]" level="INFO" doc:name="Logger"/>
        <mulexml:xslt-transformer xsl-file="transform.xsl" maxIdleTransformers="2" maxActiveTransformers="5" doc:name="XSLT" mimeType="application/xml">
        </mulexml:xslt-transformer> 
    </flow>

将 transform.xsl 放在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" />

    <xsl:template match="/">
        <xsl:for-each select="root/base/status">
                <status>
                <type>
                    <xsl:value-of select="type" />
                </type>
                <set>
                    <xsl:value-of select="set" />
                </set>
                </status>
            </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

#Solution2: 在流程中使用 XPath3for-each

<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8081" doc:name="HTTP Listener Configuration"/>

       <flow name="testFlow">
         <http:listener config-ref="HTTP_Listener_Configuration" path="/test" doc:name="HTTP"/>
          <expression-component doc:name="Expression">
         <![CDATA[
          StringBuffer sb = new StringBuffer();
          flowVars.stBuffer=sb;
           ]]>
        </expression-component>
         <foreach collection="#[xpath3('//root/base/status', message.payload, 'NODESET')]" doc:name="For Each">
             <mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>
             <logger message="#[payload.replace(&quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;&quot;, &quot;&quot;)]" level="INFO" doc:name="Logger"/>
             <set-payload value="#[payload.replace(&quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;&quot;, &quot;&quot;)]" doc:name="Set Payload"/>
              <set-payload value="#[flowVars.stBuffer.append(message.payload).toString()]" doc:name="Set Payload"/>
         </foreach>
         <set-payload value="#[flowVars.stBuffer]" doc:name="Set Payload" mimeType="application/xml"/>
         <mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>

     </flow>

两种情况,响应如下:

【讨论】:

  • 感谢您的帮助!!两个解决方案都动摇了!只是一个小小的疑问,我们没有任何直接的 xpath 函数可以给出这个精确的输出吗?在骡子里?
猜你喜欢
  • 2018-07-30
  • 2014-08-06
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多