如何精确控制SOAP响应类型如何转换为PHP类型?

时间:2013-08-03 22:06:33

标签: php xml soap php-5.3 soap-client

我正在使用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发生更改,它将无效。

1 个答案:

答案 0 :(得分:0)

您可以通过该类图功能在PHP中的几乎任何内容中转换该结果,但问题是您是否应该,因为相同的Soap数据结构通常用于请求和响应。重复使用它们!

我的一般方法是使用类映射功能将所有这些ComplexType结构映射到PHP类。如果该结构不适合预期用途,我有一个映射器步骤,可以在PHP中转换结果。