2014-11-02 65 views
2

我打電話一個SOAP服務器的方法,並且響應包括以下XML標籤:PHP SoapClient的XSI:類型響應

<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:類型=「PerRoomSupplement」。我如何獲得補充標籤的xsi:類型?我是否必須獲取最後的XML響應並通過XML庫解析它?


我提出的問題之前,我做了一些google搜索,並找到一種方法來完成我想,這可能不是理想的答案,但我想要做什麼。這萬一別人用了同樣的問題掙扎:

我知道可能的類型的補充標籤要麼PerRoomSupplement或PerPersonSupplement。我所做的是創建兩個類與這些名字,然後SOAP響應類映射到我的PHP類。這樣一來,我可以很容易地知道補充劑(通過使用get_class功能)

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

感謝,

回答

0

xsi:type="PerRoomSupplement"屬性由SoapClient的做的類型的映射哪種類型在PHP中對類型的響應。這也適用於WSDL文件中信息的幫助。

由於沒有類映射,所以沒有映射類,將爲類型映射選擇stdClass。因此,除非你提供一個類映射,從該屬性的信息已被使用(和丟失)的轉換。

下一個類映射,你也可以鉤with a typemap與您再會通過回調但只間接地獲得該屬性的信息。此外,它要求您創建自己的對象。

所以我認爲使用類映射是去保存信息的方式。