OK、SOAPClientに電話をかけてもらいます。__getLastResponse()を使用すると、XMLに次のような行が表示されます。
<Discount xsi:type="ProgressivePromotion" from="2013-05-05T00:00:00" to="2013-05-14T00:00:00" type="Percent" value="20" name="Special Deal"/>
ただし、SOAPClientクラスの関数はオブジェクトを返します。
PHPクラスの呼び出しのコードは次のとおりです。
function SearchHotels($parameters ){
$funcRet = null;
try {
$funcRet = $this->client->SearchHotels($parameters);
} catch ( Exception $e ) {
echo "(SearchHotels) SOAP Error:\n-------------------------------------\n" . $e->getMessage () . "\n\n";
echo "(SearchHotels) Request:\n-------------------------------------\n" . $this->client->__getLastRequest() . "\n\n";
echo "(SearchHotels) Response:\n-------------------------------------\n" . $this->client->__getLastResponse() . "\n\n";
}
return $funcRet;
}
返されたオブジェクトを使用すると、Discount要素から次の属性にアクセスできます。
タイプ:ProgressivePromotion
from:2013-05-05T00:00:00
to:2013-05-14T00:00:00
value:20
name:Special Deal
しかし、type="Percent"にアクセスできません
SOAPClientはxsi:typeのxsi名前空間を無視し、その属性をtypeとして格納しているようです。
では、xsi:type AND typeにアクセスして、割引がパーセントまたは金額、あるいはその他のタイプであるかどうかを確認するにはどうすればよいですか?
ところで、SOAP応答の上部に、xsiが何であるかを宣言しているものは何も表示されません。
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SearchHotelsResponse xmlns="http://tourico.com/webservices/hotelv3">
<SearchHotelsResult>
<Info xmlns="http://schemas.tourico.com/webservices/hotelv3" version="9.71" culture="en-US" serverTime="2013-02-06T14:49:58.3500117-05:00"/>
<HotelList xmlns="http://schemas.tourico.com/webservices/hotelv3">
編集
返されたオブジェクトをvar_dumpすると、次のようになります。
stdClass Object
(
[SearchHotelsResult] => stdClass Object
(
[Info] => stdClass Object
(
[version] => 9.71
[culture] => en-US
[serverTime] => 2013-02-06T15:17:59.8445748-05:00
)
[HotelList] => stdClass Object
(
[Hotel] => Array
(
[0] => stdClass Object
[RoomTypes] => stdClass Object
(
[RoomType] => Array
(
[0] => stdClass Object
(
[Discount] => stdClass Object
(
[from] => 2013-05-05T00:00:00
[to] => 2013-05-14T00:00:00
[type] => ProgressivePromotion
[value] => 20
[name] => Special Deal
)
type ="Amount"を失った方法をご覧ください。
して割引を呼び出すことはできません
echo $result->SearchHotelsResult->HotelList->Hotel[0]->RoomTypes->RoomType[0]->Discounts->type;
私が得るので
Undefined property: stdClass::$Discounts Notice: Trying to get property of non-object
そこで、オブジェクト全体を巨大な多次元配列に変換し、その方法でアクセスします。とにかく、type="Amount"はプルされていません。