与iterate mediator的wso2esb问题

时间:2016-06-07 11:51:52

标签: xpath wso2 wso2esb esb mediator

我是WSO2和XML / XPath的新手,我遇到了使迭代中介表达式工作的问题。我的情景是以下情况。我给了一个.csv文件,然后用Smooks中介和一个简单的XSLT转换转换成XML - 两者都运行正常,我之前测试过它们。它们的结果具有以下结构(并由esb放入SOAP环境中):

<?xml version='1.0' encoding='utf-8'?>
  <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Body>
          <Orderlist xmlns="http://ws.apache.org/ns/synapse">
              <Order>
                  <Nr>1234</Nr>
                  <Sender>
                      <!-- some child elements here -->>
                  </Sender>
                  <Recipient>
                      <!-- some child elements here -->
                  </Recipient>
              </Order>
              <Order> <!-- same as above --> 
              </Order>
              <!-- more orders here -->
           </Orderlist>
      </soapenv:Body>
  </soapenv:Envelope>

现在我正在使用以下代理执行我的转换,然后迭代Order元素:

    <proxy name="Aufgabe3Proxy" startOnLoad="true" trace="disable"
  transports="https http vfs" xmlns="http://ws.apache.org/ns/synapse">
  <target>
    <inSequence>
      <!-- transformations are done here, producing the above message -->          
      <iterate expression="$body/Orderlist/Order" preservePayload="true">
        <target>
            <sequence>
                <log level="full"/>
                <send>
                    <property expression="$body/Order/Start/text()"
                        name="uri.var.loc1" scope="default" type="STRING"/>
                    <property expression="$body/Order/Ziel/text()"
                        name="uri.var.loc2" scope="default" type="STRING"/>
                    <endpoint key="MapsEndpoint"/>
                </send>
            </sequence>
        </target>
      </iterate>
    </inSequence>
    <outSequence>
      <log level="full"/>
        <aggregate>
            <onComplete expression="//Orderlist">
                 <property name="transport.vfs.ReplyFileName" scope="transport"
                        type="STRING" value="responses-out.xml"/>
                 <property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
                 <send/>
            </onComplete>
        </aggregate>

    </outSequence>
    <faultSequence/>
  </target>
  <parameter name="transport.PollInterval">5</parameter>
  <parameter name="transport.vfs.FileURI">file://C:\Users\admin\Desktop\Daten\MapsPaare\in</parameter>
  <parameter name="transport.vfs.ContentType">text/plain</parameter>
  <parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
  <parameter name="transport.vfs.MoveAfterFailure">file://C:\Users\admin\Desktop\Daten\MapsPaare\fail</parameter>
  <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
  <parameter name="transport.vfs.FileNamePattern">.*.csv</parameter>
  <parameter name="transport.vfs.MoveAfterProcess">file://C:\Users\admin\Desktop\Daten\MapsPaare\out1</parameter>

    </proxy>

当我运行它并将我的.csv放入in-folger时,日志只打印读取消息和转换的结果,但仅此而已。此外,它不会写入Responses-out.xml文件(并且不会创建它)。 你能指点我在这里犯的错误吗?

编辑: 到目前为止我尝试过的一件事是:由于ESB将我的Orderlist放入命名空间,我尝试调整我的迭代表达式:

<iterate expression="$body/OL:Orderlist/OL:Auftrag" preservePayload="true"
     xmlns:OL="http://ws.apache.org/ns/synapse">

然而,当这个运行时,日志给我一个错误说:“SynapseXPath评估XPath表达式$ body / OL:Auftragsliste / OL:Auftrag导致错误”并指出它无法解析名称空间前缀OL。

2 个答案:

答案 0 :(得分:0)

您在编辑中尝试的是最好的方法。不知道为什么节点'order'变成'Auftrag',但是这个迭代必须起作用:

<iterate expression="$body/OL:Orderlist/OL:Order" preservePayload="true" xmlns:OL="http://ws.apache.org/ns/synapse">

验证ESB日志中的错误是否来自中介的其他部分

答案 1 :(得分:0)

只是得到一个明确的答案:解决方案就像我在上面的评论中写的那样。替换

<iterate expression="$body/Orderlist/Order" preservePayload="true">
    <target>
        <sequence>
            <log level="full"/>
            <send>
                <property expression="$body/Order/Start/text()"
                    name="uri.var.loc1" scope="default" type="STRING"/>
                <property expression="$body/Order/Ziel/text()"
                    name="uri.var.loc2" scope="default" type="STRING"/>
                <endpoint key="MapsEndpoint"/>
            </send>
        </sequence>
    </target>
  </iterate>

<iterate xmlns:OL="http://ws.apache.org/ns/synapse" expression="//OL:Orderlist/OL:Order" preservePayload="true">
    <target>
        <sequence>
            <log level="full"/>
            <send>
                <property expression="//OL:Order/OL:Start"
                    name="uri.var.loc1" scope="default" type="STRING"/>
                <property expression="//OL:Order/OL:Ziel"
                    name="uri.var.loc2" scope="default" type="STRING"/>
                <endpoint key="MapsEndpoint"/>
            </send>
        </sequence>
    </target>
  </iterate> 

确实解决了这个问题。