我正在使用PHP SOAP扩展(SoapClient
)来调用远程操作。它的WSDL类型如下:
<s:element name="OperationResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="OperationResult">
<s:complexType mixed="true">
<s:sequence>
<s:any/>
</s:sequence>
</s:complexType>
</s:element>
</s:sequence>
</s:complexType>
</s:element>
据我所知,类型是“任何东西”。调用的结果将转换为嵌套的stdClass
对象,不易使用:
object(stdClass)[3]
public 'OperationResult' =>
object(stdClass)[4]
public 'any' => string 'xml string here...'
(这实际上是由SOAP扩展本身执行的)
如何控制如何创建此对象?我试图将classmap
选项传递给SOAP客户端,但它不起作用:我得到了实例,但属性是null
。
手动解析结果的问题很明显。我可以创建一个新的SimpleXmlElement
,其字符串来自$result->OperationResult->any
,但如果WSDL发生更改,它将无效。
答案 0 :(得分:0)
您可以通过该类图功能在PHP中的几乎任何内容中转换该结果,但问题是您是否应该,因为相同的Soap数据结构通常用于请求和响应。重复使用它们!
我的一般方法是使用类映射功能将所有这些ComplexType结构映射到PHP类。如果该结构不适合预期用途,我有一个映射器步骤,可以在PHP中转换结果。