SAPфорум.RU
https://www.sapboard.ru/forum/

Ошибка при парсинге ответа WEB-сервиса
https://www.sapboard.ru/forum/viewtopic.php?f=70&t=92548
Страница 3 из 3

Автор:  Chaser009 [ Пт, мар 04 2016, 15:33 ]
Заголовок сообщения:  Re: Ошибка при парсинге ответа WEB-сервиса

Тяжело на расстоянии.
Еще одна попытка: корневой элемент у вас в сообщении неймспейсом не помечен. По-моему, должно что-то типа: <ns1:UserGetInfoResponse... и т.д. И закрывающий тег тоже. Как вариант.

Автор:  ceib [ Пт, мар 04 2016, 16:26 ]
Заголовок сообщения:  Re: Ошибка при парсинге ответа WEB-сервиса

Chaser009 написал:
Тяжело на расстоянии.

Понимаю) Но, увы, мне тупо больше некуда обратиться...
Chaser009 написал:
Еще одна попытка: корневой элемент у вас в сообщении неймспейсом не помечен. По-моему, должно что-то типа: <ns1:UserGetInfoResponse... и т.д. И закрывающий тег тоже. Как вариант.


Попробовал сделать с неймспейсом. После мэпинга получаю следующее:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<ns1:UserGetInfoResponse xmlns:ns1="urn:my:service:fieldclimate">
  <DataSetMain xmlns="http://schemas.xmlsoap.org/wsdl/">
    <ReturnDataInfo>
      <RDataInfo>
        <s_name xmlns:tns="http://metos.at" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">f_user_last_date</s_name>
        <s_type xmlns:tns="http://metos.at" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">xsd:string</s_type>
        <s_flags xmlns:tns="http://metos.at" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">0</s_flags>
        <s_value xmlns:tns="http://metos.at" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">4</s_value>
      </RDataInfo>
    </ReturnDataInfo>
    <ReturnRecordSetInfo>
      <s_field_count xmlns:tns="http://metos.at" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">1</s_field_count>
      <s_row_count xmlns:tns="http://metos.at" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">1</s_row_count>
    </ReturnRecordSetInfo>
    <ReturnDataSet>
      <RDataSet>2015-11-20 09:30:45.259777</RDataSet>
    </ReturnDataSet>
  </DataSetMain>
</ns1:UserGetInfoResponse>


Почему то PI начал раскидывать неймспейсы стандартные во все конечные элементы. В целом - в корневом элементе добавился неймспейс мой (в котором мои типы в ESR созданы), остальное все тоже самое, но более громоздко выглядит.

Пробовал также ко всем элемента моего неймспейса добавлять префиксы. Ситуация не меняется, вылезает все та же ошибка...

Автор:  Chaser009 [ Пт, мар 04 2016, 16:44 ]
Заголовок сообщения:  Re: Ошибка при парсинге ответа WEB-сервиса

Да нет, не то же самое. Сделайте именно так, чтобы корень был с неймспейсом, а остальное оставьте, как было.

Автор:  ceib [ Пт, мар 04 2016, 17:19 ]
Заголовок сообщения:  Re: Ошибка при парсинге ответа WEB-сервиса

Chaser009 написал:
Да нет, не то же самое. Сделайте именно так, чтобы корень был с неймспейсом, а остальное оставьте, как было.


Сделал. Сообщение после мапинга выглядит так:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<ns1:UserGetInfoResponse xmlns="http://schemas.xmlsoap.org/wsdl/"
                         xmlns:tns="http://metos.at"
                         xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                         xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                         xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
                         xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
                         xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
                         xmlns:ns1="urn:my:service:fieldclimate">
  <DataSetMain>
    <ReturnDataInfo>
      <RDataInfo>
        <s_name>f_user_last_date</s_name>
        <s_type>xsd:string</s_type>
        <s_flags>0</s_flags>
        <s_value>4</s_value>
      </RDataInfo>
    </ReturnDataInfo>
    <ReturnRecordSetInfo>
      <s_field_count>1</s_field_count>
      <s_row_count>1</s_row_count>
    </ReturnRecordSetInfo>
    <ReturnDataSet>
      <RDataSet>2015-11-20 09:30:45.259777</RDataSet>
    </ReturnDataSet>
  </DataSetMain>
</ns1:UserGetInfoResponse>


Результат все тот же. Все та же ошибка.

UPD. Ан нет - ошибка чуть изменилась, теперь ругается не на отсутствие UserGetInfoResponse а на отсутствие DataSetMain:

Code:
PARSE_APPLICATION_DATA Error during XML => ABAP conversion: Response Message; CX_ST_MATCH_ELEMENT in /1SAI/TXSC5DE0BBD404F9D8EFD71 Line 44 Элемент 'DataSetMain' ожидается XML Bytepos.: 902 XML Path: ns1:UserGetInfoResponse(1)

Значит все таи дело в неймспейсах. Буду копать дальше...

Автор:  ceib [ Сб, мар 05 2016, 14:01 ]
Заголовок сообщения:  Re: Ошибка при парсинге ответа WEB-сервиса

ceib написал(а):
Значит все таи дело в неймспейсах. Буду копать дальше...

Весьма удивлен найденной причиной неприятностей...

В XSLT-файле у меня были ссылки на пространства имен XSD, WSDL и т.д.:
Code:
<xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"            
            xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
            xmlns="http://schemas.xmlsoap.org/wsdl/" >


Во время мапинга все необходимые пространства переносятся в корневой тег сообщения, что тоже правильно и никоим образом не влияет на сам файл (URI на неймспейсы везде корректные). Однако, если убрать из XSLT все пространства кроме XSL (без которого собственно и преобразование не будет работать), то получаем в корневом теге отмапленного сообщения только одно простанство имен - то, в рамках которого в ESR создаются все объекты:

Code:
<?xml version="1.0" encoding="UTF-8"?>
<ns1:UserGetInfoResponse xmlns:ns1="urn:my:service:fieldclimate">
   <DataSetMain>
      <ReturnDataInfo>
         <RDataInfo>
            <s_name>f_user_last_date</s_name>
            <s_type>xsd:string</s_type>
            <s_flags>0</s_flags>
            <s_value>4</s_value>
         </RDataInfo>
      </ReturnDataInfo>
      <ReturnRecordSetInfo>
         <s_field_count>1</s_field_count>
         <s_row_count>1</s_row_count>
      </ReturnRecordSetInfo>
      <ReturnDataSet>
         <RDataSet>2015-11-20 09:30:45.259777</RDataSet>
      </ReturnDataSet>
   </DataSetMain>
</ns1:UserGetInfoResponse>


И все, абсолютно неожиданно, начинает работать... [s]То есть, в тегах сообщения, которое доходит до прокси не может быть записано более одного пространства имен, что представляется для меня полнейшей неожиданностью и абсолютным несоответствием стандарту[/s].

UPD. Нужно быть аккуратным с использованием неймспейса по умолчанию "xmlns=..." (см. ниже).

Автор:  Chaser009 [ Сб, мар 05 2016, 16:42 ]
Заголовок сообщения:  Re: Ошибка при парсинге ответа WEB-сервиса

То ли еще будет :-) Привыкайте.

Автор:  Chaser009 [ Вс, мар 06 2016, 07:07 ]
Заголовок сообщения:  Re: Ошибка при парсинге ответа WEB-сервиса

ceib написал(а):
xmlns="http://schemas.xmlsoap.org/wsdl/"


Эта конструкция объявляет неймспейс по умолчанию. Он нужен в ситуации, когда при написании элемента мы не указываем префикс, а пишем сразу имя элемента. То есть элемент, не имеющий префикса, считается принадлежащим к неймспейсу по умолчанию.

То есть, при такой записи у вас элементы без префикса вместо того, чтобы метиться неймспейсом корневого элемента (указать который я вам советовал выше), метятся указанным неймспесом. Отсюда и ошибки. И никаких нарушений стандартов, что характерно.

P.S. Неймспейсы использовать можно различные (и более одного), только аккуратно, особенно, при использовании своих преобразований.

Автор:  ceib [ Ср, мар 09 2016, 09:46 ]
Заголовок сообщения:  Re: Ошибка при парсинге ответа WEB-сервиса

Chaser009 написал:
ceib написал(а):
xmlns="http://schemas.xmlsoap.org/wsdl/"

То есть, при такой записи у вас элементы без префикса вместо того, чтобы метиться неймспейсом корневого элемента (указать который я вам советовал выше), метятся указанным неймспесом. Отсюда и ошибки. И никаких нарушений стандартов, что характерно.

Да, действительно, поторопился делать выводы.

Страница 3 из 3 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/