PHP SOAP-ERROR:对象没有' test2'属性

时间:2018-05-05 09:23:52

标签: php xml wsdl soap-client

我有一个来自自动生成的Web服务wsdl:

的部分xml
  <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>

但是,所有子元素(此处testtest2)是否已从父minOccurs="0"继承<xs:all minOccurs="0">

1 个答案:

答案 0 :(得分:0)

<xs:all minOccurs="0">

xs:all minOccurs适用于整个组,而不适用于元素。所以你遇到的行为是正确的。

一般建议:在使用编程语言进行测试之前,使用某些工具(如SOAPUI,Altova XML Spy(付费))来验证XML。这将节省大量时间。

类似的问题: How do I make items optional in <xs:all>?