PHP SOAP-ERROR: у объекта нет свойства 'test2' - PullRequest
0 голосов
/ 05 мая 2018

У меня есть следующий xml из части автоматически сгенерированного веб-сервиса wsdl:

  <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="test">
     <xs:element name="test">
        <xs:complexType>
           <xs:sequence>
              <xs:element name="txt" nillable="true" type="xs:string"/>
           </xs:sequence>
        </xs:complexType>
     </xs:element>
     <xs:element name="test2">
        <xs:complexType>
           <xs:sequence>
              <xs:element name="txt" nillable="true" type="xs:string"/>
           </xs:sequence>
        </xs:complexType>
     </xs:element>
     <xs:element name="request_box">
        <xs:complexType>
           <xs:all minOccurs="0">
              <xs:element ref="ns0:test"/>
              <xs:element ref="ns0:test2"/>
           </xs:all>
        </xs:complexType>
     </xs:element>
  </xs:schema>

когда я делаю мыльный звонок с php:

  $xml = "test.xml";
  $params = array(
    'test' => array(
      'txt' =>  $txt
    )
  );
  try {
    $client = new SoapClient($xml);
    $test = $client->request_box($params);
  } catch (SoapFault $fault) {
    var_dump($fault);
  }

Я получаю эту ошибку:

SOAP-ERROR: Encoding: object has no 'test2' property

Если я изменю $params и добавлю к нему test2, я не получу никаких ошибок:

  $params = array(
    'test' => array(
      'txt' =>  $txt
    ),
    'test2' => array(
      'txt' =>  $txt
    )
  );

Но я хочу, чтобы test2 был необязательным.

Если я изменю xml и добавлю minOccurs="0" к test2, проблема будет решена, и я больше не получаю никаких ошибок:

 <xs:element name="request_box">
    <xs:complexType>
       <xs:all minOccurs="0">
          <xs:element ref="ns0:test"/>
          <xs:element ref="ns0:test2" minOccurs="0"/>
       </xs:all>
    </xs:complexType>
 </xs:element>

Но не должны ли все дочерние элементы (здесь test и test2) уже наследовать minOccurs="0" от родительского <xs:all minOccurs="0">?

1 Ответ

0 голосов
/ 07 мая 2018
<xs:all minOccurs="0">

xs: all minOccurs для всей группы, а не для элементов. Таким образом, поведение, которое вы испытываете, является правильным.

Общее предложение: Используйте некоторый инструмент (например, SOAPUI, Altova XML Spy (платный)) для проверки XML перед тестированием на языке программирования. Это сэкономит много времени.

Аналогичный вопрос: Как сделать элементы необязательными в ?

...