mule xpath表达式不返回节点

时间:2014-06-14 22:37:38

标签: xpath mule

我试图在Mule流程中使用xpath来选择属性' value' under element主机基于元素Stage的当前值(将在Mule变量中)

这是XML资源文件feedHosts.xml

    <?xml version="1.0"?>
    <FeedHosts xmlns:bar="http://www.bar.org" xmlns:foo="http://www.foo.org/">
         <Host value="host1.com">
             <Stage>qa</Stage>
         </Host>
         <Host value="host2.com">
             <Stage>dev</Stage>
         </Host>
         <Host value="host3.com">
              <Stage>live</Stage>
         </Host>
     </FeedHosts> 

我尝试了一些像

这样的事情
    <set-payload value="#[groovy: getClass().getResourceAsStream('/feedHosts.xml')]" doc:name="Set Payload to feedHosts.xml"/>
    <byte-array-to-string-transformer doc:name="Byte Array to String"/>
    <mulexml:xpath-extractor-transformer name="whatever" expression="/FeedHosts/Host[Stage='#[flowVars.stage]']" resultType="NODE"/>
    <logger message="#[payload]" level="INFO" doc:name="Logger"/>

这会将feedHosts.xml加载到有效负载中,但xpath-extractor-transformer本身会返回null有效负载。显然它不会返回我想要的值属性。

任何帮助表示感谢。

3 个答案:

答案 0 :(得分:2)

XPath位置路径包含几个提供上下文的步骤。最后一个选择数据。

表达式的 last 步骤在Host的上下文中选择一组所有/FeedHosts元素。谓词将该集限制为具有包含Stage返回的文本的#[flowVars.stage]子元素的集合。

我不熟悉 Mule 变量插值语法。 假设#[flowVars.stage] 实际生成其中一个字符串qadevlive,它应该选择其中一个Host元素。

但是你说你实际上想要&#34;根据元素Stage&#34的当前值,在元素Host下选择属性&#39; <&#39; ; < / em>的。在这种情况下,最后一步应该在属性轴中,Hosts集只是您的上下文。您需要添加一个额外的步骤:

/FeedHosts/Host[Stage=#[flowVars.stage]]/@value

对于上面的插值语法,我提到了this reference

答案 1 :(得分:0)

此示例返回所需的节点和属性(感谢helderdarocha),并通过表达式变换器执行查询。 xpath-extractor-transformer表达式不接受#字符,但表达式变换器将会。

<set-payload value="#[groovy: getClass().getResourceAsStream('/hostsfile.xml')]" />
<set-variable variableName="myXPath" value="/FeedHosts/Host[Stage='#[stage]']/@value" />

<enricher target="#[flowVars.host]" doc:name="Message Enricher">
     <expression-transformer expression="#[xpath(myXPath).value]" />
</enricher>

<logger message="host is #[host]" level="INFO" doc:name="Logger"/>

答案 2 :(得分:0)

由于XML具有与之关联的命名空间,因此您需要使用Mule命名空间管理器使用Xpath提取值 https://developer.mulesoft.com/ 文档/显示/电流/ XML命名空间+
类似于以下内容: -

<mulexml:namespace-manager includeConfigNamespaces="true">
   <mulexml:namespace prefix="foo" uri="http://www.foo.org/"/>
   <mulexml:namespace prefix="bar" uri="http://www.bar.org"/>
</mulexml:namespace-manager> 

然后你可以在Xpath中获取值, https://developer.mulesoft.com/docs/display/current/XML+Module+Reference