2016-03-11 6 views
3

Я работаю над проектом, где мне нужно получить некоторые данные из webservices и вам нужно показать его на экране с помощью PHP.Только первый элемент ответа видимый - php

Когда я исполняю WebService в SoapUI я получаю такой ответ:

<soapenv:Envelope xmlns:ns="http://schemas.test.nl/are/planning/business/1.0" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header> 
     <header xmlns="http://schemas.cordys.com/General/1.0/"> 
     <msg-id>00505600-0646-11e5-fcef-ea885aa59f6e</msg-id> 
     </header> 
    </soapenv:Header> 
    <soapenv:Body> 
     <tonenbeschikbaarheidportaalresponse xmlns="http://schemas.test.nl/are/planning/business/1.0"> 
     <tonenbeschikbaarheidportaalresult> 
      <beschikbaarheidslijst starttime="06:00:00.0"> 
       <day daycode="sun"> 
        <available>0</available> 
        <starttimedate>2016-03-06T05:00:00.0</starttimedate> 
       </day> 
       <day daycode="mon"> 
        <available>0</available> 
        <starttimedate>2016-03-07T05:00:00.0</starttimedate> 
       </day> 
       <day daycode="tue"> 
        <available>0</available> 
        <starttimedate>2016-03-08T05:00:00.0</starttimedate> 
       </day> 
       <day daycode="wed"> 
        <available>0</available> 
        <starttimedate>2016-03-09T05:00:00.0</starttimedate> 
       </day> 
       <day daycode="thu"> 
        <available>0</available> 
        <starttimedate>2016-03-10T05:00:00.0</starttimedate> 
       </day> 
       <day daycode="fri"> 
        <available>0</available> 
        <starttimedate>2016-03-11T05:00:00.0</starttimedate> 
       </day> 
       <day daycode="sat"> 
        <available>1</available> 
        <starttimedate>2016-03-12T05:00:00.0</starttimedate> 
       </day> 
      </beschikbaarheidslijst> 
      <beschikbaarheidslijst starttime="07:00:00.0"> 
       <day daycode="sun"> 
        <available>0</available> 
        <starttimedate>2016-03-06T06:00:00.0</starttimedate> 
       </day> 
       <day daycode="mon"> 
        <available>0</available> 
        <starttimedate>2016-03-07T06:00:00.0</starttimedate> 
       </day> 
       <day daycode="tue"> 
        <available>0</available> 
        <starttimedate>2016-03-08T06:00:00.0</starttimedate> 
       </day> 
       <day daycode="wed"> 
        <available>0</available> 
        <starttimedate>2016-03-09T06:00:00.0</starttimedate> 
       </day> 
       <day daycode="thu"> 
        <available>0</available> 
        <starttimedate>2016-03-10T06:00:00.0</starttimedate> 
       </day> 
       <day daycode="fri"> 
        <available>0</available> 
        <starttimedate>2016-03-11T06:00:00.0</starttimedate> 
       </day> 
       <day daycode="sat"> 
        <available>1</available> 
        <starttimedate>2016-03-12T06:00:00.0</starttimedate> 
       </day> 
      </beschikbaarheidslijst> 
     </tonenbeschikbaarheidportaalresult> 
     </tonenbeschikbaarheidportaalresponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

Что мне нужно, это то, что я могу цикл по каждому beschikbaarheidslijst (список наличия на голландском языке).

Проблема в том, что ответ в моем коде почти пуст (или невидим): Я проверил, дал ли веб-сервис в другой системе ответ со значениями и сделал это.

$beschikbaarheid = $response[1]; 
var_dump($beschikbaarheid); 

Выход: объекта (StdClass) # 51 (1) { [ "tonenbeschikbaarheidportaalresult"] => объект (StdClass) # 52 (0) { } }

Также с print_r остальные объекты являются невидимыми:

$beschikbaarheid = $response[1]; 
print_r($beschikbaarheid); 

Выход: StdClass Объект ( [Тонен beschikbaarheidportaalresult] => StdClass Object ( ) )

Я хочу, чтобы петля через ответ $, но наличие мест код не попасть. $ item - NULL.

foreach($beschikbaarheid->tonenbeschikbaarheidportaalresult->children('http://schemas.test.nl/are/planning/business/1.0')->beschikbaarheidslijst as $item) 
{ 
    echo '<pre>'; 
    var_dump(get_object_vars($item)); // gives NULL 
    echo '</pre>'; 
    $data[] = get_object_vars($item); 
} 

Когда я извлекаю детей («http://schemas.test.nl/are/planning/business/1.0») -> тогда я получаю уведомление, так что пространство имен должно быть правильным:

Notice: Undefined property: stdClass::$beschikbaarheidslijst in D:\xampp\htdocs\prive\CCP\includes\inc_formulieren.php on line 187 

Можете ли вы сказать мне, как я могу петлю через beschikbaarheidslijst элементов ? Должен ли я что-то сделать с атрибутом starttime = "06: 00: 00.0"?

<beschikbaarheidslijst starttime="06:00:00.0"> 

Получаю ответ на мыло из webservice.

$response = call_service($serviceOperation, $request, $entiteit, $backend); 

echo '<pre> response from webservice '; 
var_dump($response); 
echo '</pre>'; 

response from webservice array(2) { 
    [0]=> 
    int(0) 
    [1]=> 
    object(stdClass)#51 (1) { 
    ["tonenbeschikbaarheidportaalresult"]=> 
    object(stdClass)#52 (0) { 
    } 
    } 
} 

обслуживание вызовов с использованием SoapClient и расширения:

class SoapClientNG extends \SoapClient 
{ 

    public function __doRequest($req, $location, $action, $version = SOAP_1_1) 
    { 

     $xml = explode("\r\n", parent::__doRequest($req, $location, $action, $version)); 
     $response = preg_replace('/^(\x00\x00\xFE\xFF|\xFF\xFE\x00\x00|\xFE\xFF|\xFF\xFE|\xEF\xBB\xBF)/', "", $xml[5]); 
     return $response; 
    } 
} 


function call_service($serviceOperation, $request, $entiteit, $backend) 
{ 
    $error = 0; 

    $soapClient = getSoapClient($entiteit, $backend); 

    try { 
      $response = $soapClient->__call($serviceOperation, array($request)); 

     }  
    catch (SoapFault $fault) { 
     $error = 1; 
     $response = $fault->faultcode."-".$fault->faultstring; 
    } 

return array($error, $response); 

} 

решения в сочетании с ответом Винсент:

я увидел, что мой ответ был объектом, но когда я напечатанной __getLastResponse () Я получил XML. http://php.net/manual/en/soapclient.getlastresponse.php

$response = $soapClient->__getLastResponse(); 

Когда я использую это в ответе Винсента я вижу значение на моем экране:

$xml = simplexml_load_string($response); 

    $xml->registerXPathNamespace('list', 'http://schemas.test.nl/are/planning/business/1.0'); 

foreach ($xml->xpath('//list:beschikbaarheidslijst') as $list_object) 
{ 
    print_r($list_object); 
} 
+0

ответ вы получаете в XML проверить http://php.net/manual/en/function.xml-parse-into-struct.php вручную –

+0

@RahulSingh это был объект, но теперь это XML и он работает. – massie

ответ

2

Вы отсутствующее объявление пространства имен в вашем коде, и, следовательно, он не работает, это пространство имен http://schemas.test.nl/are/planning/business/1.0 должен быть объявлен первым, а затем вы можете загрузить XML-строку, сделайте это ..

$xml_str = "YOUR SOAP RESPONSE HERE"; 

$xml = simplexml_load_string($xml_str); 

$xml->registerXPathNamespace('list', 'http://schemas.test.nl/are/planning/business/1.0'); 
foreach ($xml->xpath('//list:beschikbaarheidslijst') as $list_object) 
{ 
    print_r($list_object); 
} 

Это должно сделать трюк. Fiddle: https://eval.in/534908

+0

Благодарим вас за ответ. Мой ответ на мыло - это объект, поэтому я получаю ошибку в функции simplexml_load_string, потому что она ожидает строку, а не объект. Вы знаете, как я могу сделать simplexml с объекта? – massie

+0

Ответ на мыло, о котором вы упоминали в вопросе, определенно не является объектом. – Vincent

+1

Я использовал ваш ответ на мыло как есть, и он работает для меня, см. Здесь - https://eval.in/534908 – Vincent