У меня есть следующий 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">
?