wso2esb проблема с итерацией посредника

Я новичок в WSO2 и XML/XPath, и у меня возникают проблемы с работой выражения повторного посредника. Мой сценарий следующий. Мне дают файл .csv, который затем преобразуется в XML с помощью посредника Smooks и простого преобразования XSLT — оба работают нормально, я тестировал их ранее. Результат этого процесса имеет следующую структуру (и помещается в среду SOAP с помощью esb):

<?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 в инфолгер, журнал печатает только прочитанное сообщение и результат преобразований, но не более того. Также он не записывает файл Responses-out.xml (и не создает его). Не могли бы вы указать мне на ошибки, которые я здесь делаю?

Изменить: до сих пор я пробовал следующее: поскольку ESB помещает мой список заказов в пространство имен, я попытался настроить свое выражение Iterate следующим образом:

<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.


person user3190009    schedule 07.06.2016    source источник


Ответы (2)


Просто чтобы иметь отмеченный ответ: решение было таким, как я написал в комментарии выше. Замена

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

исправил проблему.

person user3190009    schedule 07.06.2016

То, что вы пробовали в своем редактировании, - это хороший способ сделать. Не знаю, почему узел «заказ» стал «Auftrag», но эта итерация должна работать:

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

Убедитесь, что ошибка в журнале ESB не связана с другой частью вашего агрегатора.

person Jean-Michel    schedule 07.06.2016
comment
Упс, это моя вина. Я думал, что переведу все это для лучшего понимания, должно быть, забыл это при редактировании. Я только что попробовал ‹итерировать xmlns:OL=ws.apache.org/ns/synapse выражение= //OL:Список заказов/OL:Последовательный порядок=true savePayload=true›, который, кажется, работает. Это довольно странно, и я не совсем понимаю, почему это работает, но не версия с $body. В любом случае, большое спасибо. - person user3190009; 07.06.2016
comment
Что происходит, когда я выполняю это, так это то, что журнал в последовательности дает мне пустые сообщения. Они не содержат ничего, кроме обычного конверта и тела мыльных тегов, а также пустого тега orderlist. - person user3190009; 07.06.2016
comment
какой журнал дает вам пустое сообщение: тот, что внутри inSequence/iterate, или тот, что внутри outSequence? - person Jean-Michel; 07.06.2016
comment
Он был внутри последовательности в итерации inSequence. Однако код работал, но мой ESB продолжал удалять определение пространства имен внутри скобки итерации, что решало исходную проблему, из-за которой XPath не находил никаких записей/выдавал исключение. Проблема решена сейчас. - person user3190009; 07.06.2016