PHP Soapclient xsi:输入响应

时间:2014-11-02 16:14:41

标签: php xml soap

我在SOAP服务器中调用方法,响应包含以下XML标记:

<SelctedSupplements>
    <Supplement xsi:type="PerRoomSupplement" suppId="1000680" suppName="Upgrade" supptType="4" suppIsMandatory="true" suppChargeType="Included" price="0.00" publishPrice="0.00"/>
</SelctedSupplements>

我得到的结果如下:

object(stdClass)#156 (1) {
  ["Supplement"]=>
  object(stdClass)#157 (7) {
    ["suppId"]=> int(1000680)
    ["suppName"]=> string(7) "Upgrade"
    ["supptType"]=> int(4)
    ["suppIsMandatory"]=> bool(true)
    ["suppChargeType"]=> string(8) "Included"
    ["price"]=> string(4) "0.00"
    ["publishPrice"]=> string(4) "0.00"
  }
}

所以所有属性都存在,除了xsi:type =&#34; PerRoomSupplement&#34;。如何获取Supplement标签的xsi:type?我是否必须获取最后的XML响应并通过XML库解析它?


在我提交问题之前,我做了一些谷歌搜索,并找到了一种方法来完成我想要的,它可能不是理想的答案,但它做了我想要的。在这里,万一其他人正在努力解决同样的问题:

我知道Supplement标记的可能类型是PerRoomSupplement或PerPersonSupplement。我所做的是使用这些名称创建两个类,然后将SOAP响应类映射到我的PHP类。这样,我可以很容易地知道补充的类型(通过使用get_class函数)

class PerRoomSupplement{}
class PerPersonSupplement{}
$client = new SoapClient($url, array("classmap" => array(
    "PerRoomSupplement" => "PerRoomSupplement",
    "PerPersonSupplement" => "PerPersonSupplement"
)));

谢谢,

1 个答案:

答案 0 :(得分:0)

SoapClient 使用xsi:type="PerRoomSupplement"属性将响应中的类型映射到PHP中的类型。这也可以借助WSDL文件中的信息。

由于没有类映射,因此没有映射类,将为类型映射选择 stdClass 。因此,除非您提供类图,否则该属性中的信息已在转换中使用(和丢失)。

在类图旁边,您还可以挂钩with a typemap,然后您可以通过回调间接获取该属性的信息。此外,它需要您创建自己的对象。

所以我假设使用classmap是保存信息的方法。