【问题标题】:Xpath in mule anypoint studiomule anypoint 工作室中的 Xpath
【发布时间】:2016-04-08 00:24:26
【问题描述】:

我需要使用选择路由器根据输入 XML 中的特定字段值路由消息。我正在使用最新版本的 anypoint 工作室。我无法使用 XPath 来检索和比较特定字段中的值,然后相应地路由它。有人可以让我知道如何使用 Xpath 将运营商字段与 UPS 进行比较。这是示例 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<deliver-order xmlns="http://checkout.google.com/schema/2"
google-order-number="841171949013218">
<tracking-data>
<carrier>UPS</carrier>
<tracking-number>Z5498W45987123684</tracking-number>
</tracking-data>
<send-email>true</send-email>
</deliver-order>

我需要从上述 xml 中检索运营商字段。我在选择路由器中使用 xpath 表达式 #[xpath('/deliver-order/tracking-data/carrier' == 'UPS']

【问题讨论】:

  • 您的 XPath 无法选择任何内容,因为您忽略了声明 http://checkout.google.com/schema/2 命名空间。阅读 Anypoint Studio 的文档以了解如何做到这一点。

标签: xml xpath mule


【解决方案1】:

我得到了&lt;carrier&gt; 的值并从记录器打印在控制台中...还根据字段值路由了消息..这是我所做的:- 我已将 xml 作为 file 并且我的 Mule 配置是:-

    <file:connector name="File_Global" autoDelete="true" streaming="true" validateConnections="true" doc:name="File"/>
<flow name="aaFlow1" doc:name="aaFlow1">
   <file:inbound-endpoint responseTimeout="10000" connector-ref="File_Global" doc:name="File"  path="E:\backup\test">
          <file:filename-regex-filter pattern="input.xml" caseSensitive="false"/>
  </file:inbound-endpoint>
<logger message="Trying to process : #[xpath://.[xpath:local-name()='deliver-order']/*[xpath:local-name()='tracking-data']/*[xpath:local-name()='carrier']]" level="INFO" doc:name="Logger"/> <!--Print the value of carrier -->

<choice doc:name="Choice">
  <when expression="#[xpath://.[xpath:local-name()='deliver-order']/*[xpath:local-name()='tracking-data']/*[xpath:local-name()='carrier'] ='UPS']">
   <processor-chain doc:name="Processor Chain">
     <logger message="MATCHED" level="INFO" doc:name="Logger" />
  </processor-chain>
</when>
<otherwise>
   <processor-chain doc:name="Processor Chain">
 <logger message="NO MATCH" level="INFO" doc:name="Logger" />
 </processor-chain>
</otherwise>
</choice>
</flow>

【讨论】:

  • 您好 Anirban,非常感谢您的回复。我能够以 UPS 的形式获取记录器消息,但选择过滤器失败并出现以下错误:'Unexpected '#[xpath://.[xpath:local-name()='deliver-order']/*[xpath :local-name()='tracking-data']/*[xpath:local-name()='carrier'] = 'UPS']' (org.jaxen.saxpath.XPathSyntaxException) org.jaxen.saxpath.base .XPathReader:1084 (null)'
  • 这是我的配置 xml:''
  • 这是我的选择组件配置 xml:''
  • 没关系 Anirban ......我现在可以让它工作......它是选择配置,我不得不修改一下......非常感谢你的帮助
【解决方案2】:

您可以使用 mulexml:namespace-manager 元素清理 xpath 表达式:http://www.mulesoft.org/documentation/display/current/XML+Namespaces

我不得不打广告

 <mulexml:dom-to-xml-transformer doc:name="DOM to XML"/>

能够解析 .xml 的元素 (MuleStudio 3.5)

我的完整流程:

<file:connector name="File_Global" autoDelete="false" streaming="true" validateConnections="true" doc:name="File" />

<mulexml:namespace-manager includeConfigNamespaces="true">
   <mulexml:namespace prefix="gco" uri="http://checkout.google.com/schema/2"/>
  </mulexml:namespace-manager>

<flow name="aaFlow1" doc:name="aaFlow1">
   <file:inbound-endpoint responseTimeout="10000" connector-ref="File_Global" doc:name="File"  path="/Users/vmbram/Documents">
          <file:filename-regex-filter pattern="input.xml" caseSensitive="false"/>
  </file:inbound-endpoint>

<logger message="Trying to process : #[xpath('/gco:deliver-order/gco:tracking-data/gco:carrier').text]" level="INFO" doc:name="Logger"/> <!--Print the value of carrier -->

<choice doc:name="Choice">
  <when expression="#[xpath('/gco:deliver-order/gco:tracking-data/gco:carrier')]">
   <processor-chain doc:name="Processor Chain">
     <logger message="MATCHED" level="INFO" doc:name="Logger" />
  </processor-chain>
</when>
<otherwise>
   <processor-chain doc:name="Processor Chain">
 <logger message="NO MATCH" level="INFO" doc:name="Logger" />
 </processor-chain>
</otherwise>
</choice>
</flow>

【讨论】:

  • 是可选的.. 不需要
  • 你是对的,不需要 dom-to-xml,我没有测试对。
【解决方案3】:

您的 xpath 表达式错误。使用这个 /deliver-order/tracking-data/carrier/text() 来获取实际的运营商,而不是节点。

【讨论】:

    【解决方案4】:

    你可以使用和xpath表达式如:

    [xpath('/deliver-order/tracking-data/carrier/**text()**' == 'UPS']
    

    【讨论】:

      猜你喜欢
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多