WSO2聚合器 - xpath无法遍历

时间:2013-05-01 06:26:27

标签: wso2 wso2esb

我有这个代理服务将两个xml消息聚合成一个。

  1. 我已使用xpath配置我的聚合器类
  2. 我不确定我的带有命名空间的xpath是否有效。我无法跟踪日志。
  3. 我的代理配置:

    <?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类可以使用而不是聚合中介?

    此致 大师

3 个答案:

答案 0 :(得分: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 :(得分:1)

您的XPATH错误,因为您没有定义名称空间。

我相信你正在处理SOAP消息。如果是,您是否复制了上面的确切消息。我看不到SOAP的身体?您应该做的是将xml有效负载丰富到SOAP主体中,并从aggrgate介体中对它们进行聚合。在那里你只需要考虑SOAP body作为根,给XPATH。在你的情况下它应该是

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

答案 2 :(得分:1)

你在做什么在逻辑上是不正确的。如果没有在inSequence中放置迭代介体,则无法在inSequence中聚合消息。 Clone / Iterate和Aggregate介体之间存在关联。您只能聚合在同一代理服务中拆分或克隆的邮件。