我有一个来自自动生成的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>
但是,所有子元素(此处test
和test2
)是否已从父minOccurs="0"
继承<xs:all minOccurs="0">
?
答案 0 :(得分:0)
<xs:all minOccurs="0">
xs:all minOccurs适用于整个组,而不适用于元素。所以你遇到的行为是正确的。
一般建议:在使用编程语言进行测试之前,使用某些工具(如SOAPUI,Altova XML Spy(付费))来验证XML。这将节省大量时间。