как отформатировать вывод ответа в xml в wso2 esb

У меня есть веб-сервис SAP MII, который, когда я пытаюсь использовать мыльный интерфейс, дает мне ответ:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
       xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <soap:Body>
              <XacuteResponse xmlns="http://www.sap.com/xMII">
                     <Rowset>
                           <Row>
                                  <outxml><![CDATA[&lt;BAPI_PROCORD_GET_LIST&gt;
&lt;INPUT&gt;&lt;COLLECTIVE_ORDER/&gt;&lt;/INPUT&gt;
&lt;OUTPUT&gt;&lt;RETURN&gt;&lt;TYPE/&gt;&lt;ID/&gt;&lt;NUMBER&gt;000&lt;/NUMBER&gt;&lt;MESSAGE/&gt;&lt;LOG_NO/&gt;&lt;LOG_MSG_NO&gt;000000&lt;/LOG_MSG_NO&gt;&lt;MESSAGE_V1/&gt;&lt;MESSAGE_V2/&gt;&lt;MESSAGE_V3/&gt;&lt;MESSAGE_V4/&gt;&lt;PARAMETER/&gt;&lt;ROW&gt;0&lt;/ROW&gt;&lt;FIELD/&gt;&lt;SYSTEM/&gt;&lt;/RETURN&gt;&lt;/OUTPUT&gt;
&lt;TABLES&gt;&lt;MATERIAL_RANGE&gt;&lt;item&gt;&lt;SIGN&gt;I&lt;/SIGN&gt;&lt;OPTION&gt;EQ&lt;/OPTION&gt;&lt;LOW&gt;RUBBER_COMPOUND&lt;/LOW&gt;&lt;HIGH/&gt;&lt;/item&gt;&lt;/MATERIAL_RANGE&gt;&lt;MRP_CNTRL_RANGE/&gt;&lt;ORDER_HEADER&gt;&lt;item&gt;&lt;ORDER_NUMBER&gt;000070001202&lt;/ORDER_NUMBER&gt;&lt;PRODUCTION_PLANT&gt;3100&lt;/PRODUCTION_PLANT&gt;&lt;MRP_CONTROLLER/&gt;&lt;PRODUCTION_SCHEDULER/&gt;&lt;MATERIAL&gt;RUBBER_COMPOUND&lt;/MATERIAL&gt;&lt;EXPL_DATE&gt;2014-02-03&lt;/EXPL_DATE&gt;&lt;ROUTING_NO&gt;0000013579&lt;/ROUTING_NO&gt;&lt;RESERVATION_NUMBER&gt;0000069876&lt;/RESERVATION_NUMBER&gt;&lt;SCHED_RELEASE_DATE&gt;2014-02-03&lt;/SCHED_RELEASE_DATE&gt;&lt;ACTUAL_RELEASE_DATE&gt;2014-02-03&lt;/ACTUAL_RELEASE_DATE&gt;&lt;FINISH_DATE&gt;2014-02-03&lt;/FINISH_DATE&gt;&lt;START_DATE&gt;2014-02-03&lt;/START_DATE&gt;&lt;PRODUCTION_FINISH_DATE&gt;2014-02-03&lt;/PRODUCTION_FINISH_DATE&gt;&lt;PRODUCTION_START_DATE&gt;2014-02-03&lt;/PRODUCTION_START_DATE&gt;&lt;ACTUAL_START_DATE&gt;2014-02-04&lt;/ACTUAL_START_DATE&gt;&lt;ACTUAL_FINISH_DATE&gt;0000-00-00&lt;/ACTUAL_FINISH_DATE&gt;&lt;SCRAP&gt;0&lt;/SCRAP&gt;&lt;TARGET_QUANTITY&gt;100.000&lt;/TARGET_QUANTITY&gt;&lt;UNIT&gt;ST&lt;/UNIT&gt;&lt;UNIT_ISO&gt;PCE&lt;/UNIT_ISO&gt;&lt;PRIORITY/&gt;&lt;ORDER_TYPE&gt;PI01&lt;/ORDER_TYPE&gt;&lt;ENTERED_BY&gt;277458&lt;/ENTERED_BY&gt;&lt;ENTER_DATE&gt;2014-02-03&lt;/ENTER_DATE&gt;&lt;DELETION_FLAG/&gt;&lt;WBS_ELEMENT&gt;00000000&lt;/WBS_ELEMENT&gt;&lt;CONF_NO&gt;0000108111&lt;/CONF_NO&gt;&lt;CONF_CNT&gt;00000001&lt;/CONF_CNT&gt;&lt;INT_OBJ_NO&gt;000000000000000000&lt;/INT_OBJ_NO&gt;&lt;SCHED_FIN_TIME&gt;06:07:49&lt;/SCHED_FIN_TIME&gt;&lt;SCHED_START_TIME&gt;06:07:49&lt;/SCHED_START_TIME&gt;&lt;COLLECTIVE_ORDER/&gt;&lt;ORDER_SEQ_NO&gt;00000000000000&lt;/ORDER_SEQ_NO&gt;&lt;FINISH_TIME&gt;06:07:49&lt;/FINISH_TIME&gt;&lt;START_TIME&gt;06:07:49&lt;/START_TIME&gt;&lt;ACTUAL_START_TIME&gt;15:43:47&lt;/ACTUAL_START_TIME&gt;&lt;LEADING_ORDER/&gt;&lt;SALES_ORDER/&gt;&lt;SALES_ORDER_ITEM&gt;000000&lt;/SALES_ORDER_ITEM&gt;&lt;PROD_SCHED_PROFILE/&gt;&lt;MATERIAL_TEXT&gt;RubberCompound&lt;/MATERIAL_TEXT&gt;&lt;SYSTEM_STATUS&gt;TECO PCNF MACM SETC
&lt;/TABLES&gt;
&lt;/BAPI_PROCORD_GET_LIST&gt;]]></outxml>
                           </Row>
                     </Rowset>
              </XacuteResponse>
       </soap:Body>
</soap:Envelope>

Проблема в том, что когда я создаю проход через прокси-сервер веб-службы, то при запуске службы в пользовательском интерфейсе мыла я получаю значение мусора из esb. Я хочу преобразовать этот ответ в хорошо сформированную структуру XML ответа. Я пытался использовать xslt, но он выдает ошибку в esb, поскольку невозможно создать структуру ответа. Тот же xslt при запуске на eclipse работает нормально. Пожалуйста, помогите мне. Заранее спасибо и с нетерпением жду ваших решений.


person Roy    schedule 01.04.2014    source источник


Ответы (1)


Фрагмент XML внутри CDATA имеет неправильный формат (отсутствуют конечные теги).

Но если вы найдете способ исправить это, и если данный синтаксис в вашем сообщении - это именно то, что вы получаете, вы можете попробовать это:

1- получить содержимое CDATA:

<property name="CDATA_CONTENT" expression="$body//outxml"/>

2- создайте новое свойство XML с этим содержимым:

<script language="js">mc.setProperty("XML_CONTENT",new XML(new XML(mc.getProperty('CDATA_CONTENT'))));</script>

3- извлечь значения из этого XML-фрагмента:

<log level="custom">
  <property name="result" expression="get-property('XML_CONTENT')"/>
  <property name="orderNumber" expression="get-property('XML_CONTENT')//ORDER_NUMBER/text()"/>
</log>

4- измените текущую полезную нагрузку сообщения с помощью этого фрагмента XML:

<script language="js">mc.setPayloadXML(new XML(new XML(mc.getProperty('CDATA_CONTENT'))));</script>
person Jean-Michel    schedule 01.04.2014
comment
Спасибо за ответ, Жан, но когда я хочу зарегистрировать значение свойства CDATA_CONTENT, я ничего не получаю. вот код - person Roy; 02.04.2014
comment
‹outSequence xmlns=ws.apache.org/ns/synapse› ‹property name=CDATA_CONTENT выражение =$body//outxml/› ‹xslt key=SapTransformation/› ‹log level=custom› ‹property name=result expression=get-property('CDATA_CONTENT')/› ‹/log› ‹send/› ‹/outSequence› - person Roy; 02.04.2014
comment
Это из-за пространства имен, XPATH должен быть чем-то вроде $body//sap:outxml с xmlns:sap=h ttp://www.sap.com/xMII (без пробела между h и ttp... но он исчезает в этот комментарий иначе) - person Jean-Michel; 02.04.2014
comment
Все еще с той же проблемой. Еще одна вещь, если я регистрирую свойство с выражением как $body, я вижу ‹axis2ns5:binary xmlns:axis2ns5=_http://ws.apache.org/commons/ns/payload›Значение мусора, например YQ==‹/axis2ns5:binary › - person Roy; 02.04.2014
comment
Не уверен, что понял, кажется, что ваше ответное SOAP-сообщение не то, которое вы показываете в своем сообщении: попробуйте с ‹log level=full/› в outSequence - person Jean-Michel; 02.04.2014
comment
Это действительно странно. Когда я запускаю исходную службу SAP MII в пользовательском интерфейсе мыла, я получаю правильный ответ с CDATA, о котором я упоминал в своем вопросе, но когда я нажимаю на прокси-сервер вышеуказанной службы. Кроме того, когда я делаю полный уровень журнала, я получаю вышеуказанный двоичный вывод. - person Roy; 02.04.2014
comment
Каков тип содержимого ответного сообщения (используйте представление строки ответа в SoapUI)? - person Jean-Michel; 02.04.2014
comment
тип содержимого: текст/xml; charset=кодировка содержимого UTF-8: gzip - person Roy; 02.04.2014
comment
проверьте, связан ли конкретный messageBuilder с contentType=text/xml внутри конфигурации axis2 (repository/conf/axis2/axis2.xml) - person Jean-Michel; 02.04.2014
comment
ответ от службы sap — GZIPPED Response. Как его распаковать - person Roy; 03.04.2014
comment
На мой взгляд, wso2 должен распаковать его, но для теста перестаньте принимать кодировку gzip с этим свойством внутри inSequence: ‹property name=Accept-Encoding scope=transport action=remove/› - person Jean-Michel; 03.04.2014
comment
Я сделал, как вы предложили, но все еще та же проблема. Когда я пробую это с saopUI, он дает мне wsdl службы sap в качестве ответа. - person Roy; 03.04.2014
comment
Извините, больше ничем не могу вам помочь, похоже проблема не в WSO2 ESB. Я надеюсь, что вы найдете решение с помощью службы SAP, а затем надеюсь, что мой первоначальный ответ поможет вам десериализовать содержимое CDATA. - person Jean-Michel; 03.04.2014
comment
попробуй uri fromat с "оспой" - person Kapila Ranasinghe; 19.04.2017