2013-05-01 69 views
1

我有這個代理服務將兩個xml消息聚合成一個。WSO2聚合器 - xpath無法遍歷

  1. 我已經配置我的聚合器類使用XPath
  2. 我不知道我的命名空間的XPath是否有效。我無法跟蹤日誌。

我的代理服務器配置:

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="prescription" 
     transports="https http jms" 
     startOnLoad="true" 
     trace="disable"> 
    <description/> 
    <target> 
     <inSequence> 
     <aggregate> 
      <completeCondition> 
       <messageCount min="2" max="2"/> 
      </completeCondition> 
      <onComplete expression="//soapenv:Envelope//f:Prescription//f:identifier//f:id//@value"> 

       <send> 
        <endpoint> 
        <address uri="jms:/report?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://localhost:61616"/> 
        </endpoint> 
       </send> 

      </onComplete> 
     </aggregate> 

     </inSequence> 
     <outSequence> 
     <drop/> 
     </outSequence> 
     <faultSequence/> 
    </target> 
    <parameter name="transport.jms.ContentType"> 
     <rules> 
     <jmsProperty>contentType</jmsProperty> 
     <default>application/xml</default> 
     </rules> 
    </parameter> 
</proxy> 

我輸入消息是這樣的:(我要根據病人ID彙總)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://isova.wipro.com/"> 


<Prescription xmlns="http://hl7.org/fhir"> 
    <identifier> 
    <id value="A0001"/> 
    </identifier> 
    <status value="active"/> 
    <patient> 
    <type value="Patient"/> 
    <url value="Bhavani"/> 
    </patient> 
    <prescriber> 
    <type value="Provider"/> 
    <url value="Dr.Mathews"/> 
    </prescriber> 
    <medicine> 
    <identification> 
     <text value="Zintac"/> 
    </identification> 
    </medicine> 
</Prescription></soapenv:Envelope> 

有什麼建議?

問候 大師 @gnanagurus


我不能幫助解決這個問題。這是我最新的WSO2代理。

這些是'處方'隊列中存在的兩條消息。

消息1:

<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://isova.wipro.com/"> 


<Prescription xmlns="http://hl7.org/fhir"> 
    <identifier> 
    <id value="A0001"/> 
    </identifier> 
    <status value="active"/> 
    <patient> 
    <type value="Patient"/> 
    <url value="Bhavani"/> 
    </patient> 
    <prescriber> 
    <type value="Provider"/> 
    <url value="Dr.Mathews"/> 
    </prescriber> 
    <medicine> 
    <identification> 
     <text value="Zintac"/> 
    </identification> 
    </medicine> 
</Prescription></soapenv:Envelope></soapenv:Body></soapenv:Envelope> 

消息2:

<?xml version='1.0' encoding='UTF-8'?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"><soapenv:Body><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://isova.wipro.com/"> 


<Prescription xmlns="http://hl7.org/fhir"> 
    <identifier> 
    <id value="A0001"/> 
    </identifier> 
    <status value="active"/> 
    <patient> 
    <type value="Patient"/> 
    <url value="Bhavani"/> 
    </patient> 
    <prescriber> 
    <type value="Provider"/> 
    <url value="Dr.John"/> 
    </prescriber> 
    <medicine> 
    <identification> 
     <text value="tintac"/> 
    </identification> 
    </medicine> 
</Prescription></soapenv:Envelope></soapenv:Body></soapenv:Envelope> 

代理:

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="prescription" 
     transports="https http jms" 
     startOnLoad="true" 
     trace="disable"> 
    <description/> 
    <target> 
     <inSequence> 


     <aggregate> 
       <completeCondition> 
        <messageCount min="2"/> 
       </completeCondition> 
       <onComplete expression="/Prescription"> 
       <send> 
        <endpoint> 
        <address uri="jms:/report?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://localhost:61616"/> 
        </endpoint> 
       </send> 
       </onComplete> 
      </aggregate> 
     </inSequence> 
     <outSequence> 
     <drop/> 
     </outSequence> 
     <faultSequence/> 
    </target> 
    <parameter name="transport.jms.ContentType"> 
     <rules> 
     <jmsProperty>contentType</jmsProperty> 
     <default>application/xml</default> 
     </rules> 
    </parameter> 
</proxy> 

這不是解決我的聚集。這兩條消息沒有得到聚合器。我嘗試使用名稱空間的多個xpath。 Anyhelp非常需要。

是否有任何WSO2聚合器自定義Java類,我可以使用,而不是聚合中介?

問候 大師

+0

作爲一個提示,也許不要在xpath表達式中使用太多//因爲您知道結構 - one /就足夠了。 – FiveO 2013-05-01 14:40:54

回答

1

你XPATH是錯誤的,因爲你沒有定義你的命名空間。

我相信你正在處理SOAP消息。如果是的話,你複製上面的確切消息。我看不到SOAP身體?你應該做的是將你的xml有效載荷充實到SOAP主體中,並從aggrgate mediator中聚合它們。在那裏你只需要考慮以SOAP身體爲根的XPATH。在你的情況下,它應該是

<onComplete xmlns:f="http://hl7.org/fhir" expression="//f:Prescription/f:identifier/f:id/text()"> 
3

是的,你需要定義命名空間f。你可以在一開始做的是直接:

<proxy xmlns="http://ws.apache.org/ns/synapse" xmlns:f="http://hl7.org/fhir" 

那麼你當然可以使日誌輸出,以驗證您的XPath表達式(非常有用):

<log level="custom"> 
    <property name="yourXPathTest" expression="$body/f:Prescription/f:identifier/f:id/@value"/> 
</log> 
1

你在做什麼邏輯上不是正確。如果沒有在inSequence中放置迭代介體,則無法在inSequence中聚合消息。 克隆/迭代和聚合介體之間有相關性。您只能聚合在同一個代理服務中分割或克隆的消息。