2014-07-26 38 views
1

我需要使用選擇路由器根據輸入XML中的特定字段值路由郵件。我正在使用Anypoint Studio的最新版本。我無法使用XPath檢索並比較特定字段中的值,然後相應地進行路由。有人可以讓我知道如何使用Xpath將運營商字段與UPS進行比較。這裏是示例XML文件:在mule Anypoint工作室中的Xpath

<?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 expressiosn中選擇路由器等 #[的xpath(「/遞送階/跟蹤數據/載體」 ==「UPS」]

+0

你的XPath沒有選擇任何東西,因爲你忘了申報'HTTP:// checkout.google.com /模式/ 2'命名空間。閱讀Anypoint Studio的文檔,瞭解如何做到這一點。 – Tomalak

回答

0

我得到的<carrier>值和從記錄器在控制檯印刷.. 。也路由消息基於字段值。這裏是我做過什麼: - 我已經採取了XML文件和我的騾子的配置是: -

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

嗨Anirban,非常感謝你的回覆。我能夠獲得記錄器消息作爲UPS,但選擇過濾器失敗,出現以下錯誤:'Unexpected'#[xpath://。[xpath:local-name()='deliver-order']/* [xpath :local-name()='carrier'] ='UPS']'(org.jaxen.saxpath.XPathSyntaxException) org.jaxen.saxpath。:local-name()='tracking-data']/* [xpath: base.XPathReader:1084(null)' – kamalesh

+0

這裏是我的配置xml:'' – kamalesh

+0

這裏是我配置xml的選擇組件:' <評估者=「xpath」表達= 「#[xpath的:// [xpath的:本地名稱()= '遞送階']/* [xpath的:本地名稱()= '跟蹤數據']/* [xpath的:本地名稱() ='carrier'] ='UPS']「> ' – kamalesh

0

你可以清理通過使用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> 
+0

是可選的..不需要 –

+0

你'沒錯,不需要dom-to-xml,我沒有正確測試。 – BWithaar

0

你的XPath表達式是錯誤的。使用這一個/ deliver-order/tracking-data/carrier/text()來獲取實際的載體,而不是節點。

0

您可以使用與XPath表達式,如:

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