Неустранимая ошибка: вызов функции-члена asXML() для необъекта

Я знаю, что подобные вопросы уже задавались, однако я пробовал решения без какого-либо успеха. Я продолжаю получать эту ошибку:

Неустранимая ошибка: вызов функции-члена asXML() для не-объекта в... в строке 188

Вот мой код:

$dom->save("productInfo.xml");
$feedHandle = file_get_contents("productInfo.xml");

 $params = array(
'AWSAccessKeyId'=> "*****",
'Action'=>"SubmitFeed",
'SellerId'=> "********",
'SignatureMethod' => "HmacSHA256",
'SignatureVersion'=> "2",
'Timestamp'=> gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time()),
'Version' => "2009-01-01",
'FeedContent' => $feedHandle,//must be a string
'FeedType' => "_POST_PRODUCT_DATA_");

 // Sort the URL parameters
$url_parts = array();
foreach(array_keys($params) as $key)
$url_parts[] = $key . "=" . str_replace('%7E', '~', rawurlencode($params[$key]));
  sort($url_parts);

  // Construct the string to sign
$url_string = implode("&", $url_parts);
$string_to_sign = "GET\nmws.amazonservices.com\n/Feeds/2009-01-01\n" . $url_string;

  // Sign the request
$signature = hash_hmac("sha256", $string_to_sign, "******", TRUE);

  // Base64 encode the signature and make it URL safe
$signature = urlencode(base64_encode($signature));

$url = "https://mws.amazonservices.com/Feeds/2009-01-01" . '?' . $url_string . "&Signature=" . $signature;

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL,$url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, 15);
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  $response = curl_exec($ch);

  $parsed_xml = simplexml_load_string($response); 

  @fclose($feedHandle);

  Header('Content-type: text/xml');
  print($parsed_xml->asXML());

Я знаю, что $parsed_xml === FALSE, поэтому я знаю, что обработка XML не работает. Я подозреваю, что это как-то связано с $feedHandle, поскольку ранее я получал сообщение об ошибке, в котором говорилось, что FeedContent в массиве $params пуст. Я знаю, что XML отформатирован правильно, так как я распечатал его, а также прямо поместил в нужное поле, и он работал нормально. Кроме того, мы использовали скручивание в аналогичном файле, и он работал нормально, поэтому я не думаю, что это будет проблемой.


person stackUser4444    schedule 07.01.2015    source источник
comment
Я попытался использовать var_dump, но не получил ответа True или False. Что получил вы?   -  person IMSoP    schedule 08.01.2015
comment
Ничего не распечатывалось на странице и не появлялось в источнике просмотра   -  person stackUser4444    schedule 08.01.2015
comment
Ах, вы поставили var_dump вокруг выражения, которое содержит ошибку, где у вас есть print() в приведенном выше примере? Это означало бы запустить его после фатальной ошибки, что не сработает. Если вы попробуете var_dump?($parsed_xml), вы, вероятно, обнаружите, что у вас есть объект false, а не объект SimpleXMLElement. В этом случае включите отчет об ошибках и убедитесь, что для параметра libxml_use_internal_errors не установлено значение true.   -  person IMSoP    schedule 08.01.2015
comment
Сообщение об ошибке на странице гласит: Эта страница содержит следующие ошибки: ошибка в строке 2 в столбце 1: документ пуст. Ниже представлено отображение страницы до первой ошибки.   -  person stackUser4444    schedule 08.01.2015
comment
Также я подтвердил, что var_dump возвращает false. И в источнике страницы написано: bool (false) Неустранимая ошибка: вызов функции-члена asXML() для не-объекта в W:\wwwroot\Megan\src\amazonFeedTesting.php в строке 193   -  person stackUser4444    schedule 08.01.2015


Ответы (2)


Ошибка, которую вы получаете, предполагает, что вызов функции simplexml_load_string завершился неудачно. Он возвращает объект только в том случае, если обработка XML-файла прошла успешно, в противном случае возвращается логическое значение FALSE. Попробуйте проверить, если $parsed_xml === FALSE. Если он возвращает FALSE, попробуйте проверить сам файл XML.

На самом деле, поскольку вы скручиваете сам файл, проверьте правильность установки всех полей и правильность используемого URL-адреса, распечатав его.

person EmmanuelG    schedule 07.01.2015
comment
Кроме того, попробуйте настроить уровень сообщений об ошибках так, чтобы отображались предупреждения; согласно документации для simplexml_load_string, которая содержит всю эту информацию , функция создает сообщение об ошибке E_WARNING для каждой ошибки, обнаруженной в данных XML. - person sgress454; 08.01.2015

используйте try catch и вместо использования класса Exception попробуйте класс Throwable

Пример :-

try {
    $x = false;
    var_dump($x->asXML());
} catch(Throwable $e) {
    echo $e->getMessage();
}
person Smruti Ranjan    schedule 10.03.2018
comment
@NicoHaase этот код всегда перехватывает исключение, поскольку класс Exception находится под классом Throwable в иерархии. Этот подход работал для меня в моем приложении Laravel. PS. вы также используете eval(). Тогда вы сможете правильно контролировать вывод (это то, что делает laravel) - person Smruti Ranjan; 30.03.2018