не удается разрешить ошибку Node no longer exists

#php #simplexml

#php #simplexml

Вопрос:

Я пытаюсь использовать youtube xml для отображения некоторых данных, но появляется эта ошибка. В теории я даже знаю, что не так

 $xmlData = simplexml_load_string(utf8_encode(file_get_contents('http://gdata.youtube.com/feeds/api/videos/'.$v.'?fields=title,yt:recorded,yt:statistics'))); //$v is video array
$title = (string)$xmlData->title;
$entry = $xmlData;

$namespaces = $entry->getNameSpaces(true);
$yr = $entry->children((string)$namespaces['yt']);

// get <yt:recorded> node for date and replace yyyy-mm-dd to dd.mm.yyyy
$year = substr($yr->recorded, 0,4); 
$month = substr($yr->recorded, 5,2);
$day = substr($yr->recorded, 8,2);
$recorddate = $day.".".$month.".".$year;

// get <yt:stats> node for viewer statistics, and here the problem starts (error appears if view count is 0 / node does not exist)
  $attrs = $yr->statistics->attributes(); 
      $viewCount = $attrs[(string)'viewCount']; 

                     { echo '<p>'.$recorddate.'<br>'.$title.'<br>'; 
                     if ($viewCount > 0)
 echo $viewCount.'</p></div>';
else
echo '(show some other text)</p></div>';      }
  

Я знаю, что для решения этой проблемы вы должны сообщить php, что node является строкой, но мне все еще не удалось сделать это, не нарушив остальной код

Комментарии:

1. Опубликуйте входные данные XML, а также полное сообщение об ошибке. Важен номер строки, обязательно укажите, какая это строка.

Ответ №1:

 $viewCount = 0;
if ($yr->statistics->count() > 0) {
$attrs = $yr->statistics->attributes();
 $viewCount = $attrs['viewCount'];
}
  

приятно, но для тех, у кого php предыдущей версии 5.3.0, это не сработает : (
есть решения получше?

Ответ №2:

Решение, которое должно работать также для пользователей php <= 5.2

   $viewCount = 0;
if (count($yr->statistics) > 0) {
    $attrs = $yr->statistics->attributes(); 
    $viewCount = $attrs['viewCount'];
}
  

Ответ №3:

У меня только что возникла эта проблема. Похоже, вам нужно сначала проверить, доступны ли какие-либо статистические данные, а затем попытаться получить доступ к атрибутам.

 $viewCount = 0;
if ($yr->statistics->count() > 0) {
    $attrs = $yr->statistics->attributes(); 
    $viewCount = $attrs['viewCount'];
}
  

YouTube, похоже, не добавляет атрибуты, если видео не было просмотрено. Итак, если у вас есть видео с количеством просмотров 0, YouTube не устанавливает количество просмотров равным 0, он просто полностью опускает его.

Ответ №4:

Вы неправильно используете приведение. Эта строка не преобразует SimpleXMLElement объект в строку. (он преобразует строку 'viewCount' в строку, которая не имеет смысла)

 $viewCount = $attrs[(string)'viewCount'];
  

Это делает:

 $viewCount = (string) $attrs['viewCount'];