1

Soap Requestから応答を受け取り、それを新しいSimpleXMLコンストラクトに渡します。

$response = $this->client->$method(array("Request" => $this->params));
$response_string = $this->client->__getLastResponse();
$this->response = new Classes_Result(new SimpleXMLElement($result));

$ response_stringをエコーすると、適切なxml文字列が出力されます。かなり長いので、これがスニペットです。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body><GetClassesResponse xmlns="http://clients.mindbodyonline.com/api/0_5">      
    <GetClassesResult>
     <Status>Success</Status>
     <XMLDetail>Full</XMLDetail>
     <ResultCount>6</ResultCount>
     <CurrentPageIndex>0</CurrentPageIndex>
     <TotalPageCount>1</TotalPageCount>
     <Classes>
      <Class>
       <ClassScheduleID>4</ClassScheduleID>
       <Location>
        <SiteID>20853</SiteID>
  ....</soap:Envelope>

ただし、このオブジェクトを操作しようとすると、エラーが発生するか、オブジェクトをダンプすると次のように出力されます。

object(SimpleXMLElement)#51 (0)

なぜこれが起こっているのか考えはありますか?

4

1 に答える 1

2

を実際に使用しておらず、に渡した場所を$response_string設定していません。$resultnew SimpleXMLElement($result)

$response_stringおそらく、?を介して文字列を使用してSimpleXMLオブジェクトを構築するつもりsimplexml_load_string()ですか?

$response = $this->client->$method(array("Request" => $this->params));
$response_string = $this->client->__getLastResponse();
// Load XML via simplexml_load_string()
$this->response = new Classes_Result(simplexml_load_string($response_string));

// Or if you do expect a SimpleXMLElement(), pass in the string
$this->response = new Classes_Result(new SimpleXMLElement($response_string));

SOAP応答の<soap:Body>要素は、()で名前空間が設定されますsoap。SimpleXMLでループするには、正しい名前空間を指定する必要があります。

// After creating new SimpleXMLElement()
var_dump($this->response->children("http://schemas.xmlsoap.org/soap/envelope/"));

// class SimpleXMLElement#2 (1) {
//   public $Body =>
//   class SimpleXMLElement#4 (0) {
//  }
// }

体をループするには:

foreach ($this->response->children("http://schemas.xmlsoap.org/soap/envelope/") as $b) {
  $body_nodes = $b->children();
  // Get somethign specific
  foreach ($body_nodes->GetClassesResponse->GetClassesResult as $bn) {
    echo $bn->ResultCount . ", ";
    echo $bn->TotalPageCount;
  }
}
// 6, 1
于 2012-09-28T02:45:35.230 に答える