【问题标题】:mule xpath expression not returning nodemule xpath表达式不返回节点
【发布时间】:2014-06-14 22:37:37
【问题描述】:

我正在尝试在 Mule 流中使用 xpath 根据元素 Stage 的当前值(将在 Mule 变量中)选择元素 Host 下的属性“值”

这里是 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 本身会返回一个空负载。显然它不会返回我想要的 value 属性。

任何帮助表示赞赏。

【问题讨论】:

  • &lt;logger message="#[flowVars.stage]" level="INFO" doc:name="Logger"/&gt; 输出什么?
  • #[flowVars.stage] 是字符串'qa'

标签: xpath mule


【解决方案1】:

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

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

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

但你说你实际上是要“根据元素Stage的当前值选择元素Host下的属性'value'。在这种情况下,最后一步应该在属性轴中,而Hosts 集只是你的上下文。您需要添加一个额外的步骤:

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

上面的插值语法我参考了this reference

【讨论】:

  • 我不熟悉 Mule 如何插入变量。我假设#[...] 是这样工作的。 flowVars.stage 来自哪里?会不会是 #[/FeedHosts/Host[Stage=flowVars.stage]]/@value] 之类的东西,或者可能有一些语法可以将参数传递给表达式。
  • 阅读示例here(参见第 5 节 - 使用 XPath),您似乎必须将各个 XPath 表达式分配给您的 mule 变量,因此当您获取变量时,您的 XPath 表达式是执行
  • Mule 似乎不支持字符串插值,但它似乎应该在 XPath 表达式中。所以有两种选择:1)如果是这样,您可以尝试删除撇号:/FeedHosts/Host[Stage=#[flowVars.stage]]/@value。 2) 如果这不起作用,您也许可以改用字符串连接:"/FeedHosts/Host[Stage='&amp;quot; + flowVars.stage + &amp;quot;']/@value"。不幸的是,我现在无法在这里测试。如果这些解决方案中的任何一个有效,请告诉我,我会编辑答案。
  • 我从this SO answer得到了关于concatenation策略的信息
  • 我会最后一次尝试使用[Stage=' + flowVars.stage + '](我从另一个答案中得到它,但我真的不明白为什么&amp;quot;
【解决方案2】:

此示例返回所需的节点和属性(感谢helderdarocha),并通过表达式转换器执行查询。 xpath-extractor-transformer 表达式不接受 # 字符,但 expression-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"/>

【讨论】:

    【解决方案3】:

    由于你的 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

    【讨论】:

      猜你喜欢
      • 2012-06-04
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多