web-dev-qa-db-ja.com

SimpleXML-「ノードはもう存在しません」

このYouTubeプレイリストフィードからビデオデータを取得し、興味深いデータを配列に追加して後で使用しようとしていますが、フィードからわかるように、一部のビデオリンクが「デッド」であり、コードに問題が発生します。

$ attrs ['url']にアクセスしようとすると、「ノードが存在しなくなりました」というエラーが表示されます。ノードにアクセスする前にノードが存在するかどうかを確認する方法を見つけるために何時間も試しましたが、運がありません。

誰かが同じ結果でフィードを別の方法で解析するか、動作するif-node-existsチェックを作成するのを手伝ってくれるなら、私は最も幸せです。前もって感謝します

$url = 'http://gdata.youtube.com/feeds/api/playlists/18A7E36C33EF4B5D?v=2';

$sxml = simplexml_load_file($url);
$i = 0;
$videoobj;

foreach ($sxml->entry as $entry) {
    // get nodes in media: namespace for media information
    $media = $entry->children('http://search.yahoo.com/mrss/');

    // get video player URL
    $attrs = $media->group->player->attributes();
    $videoobj[$i]['url'] = $attrs['url'];

    // get video thumbnail
    $attrs = $media->group->thumbnail[0]->attributes();
    $videoobj[$i]['thumb'] = $attrs['url']; 
    $videoobj[$i]['title'] = $media->group->title;
    $i++;
}
19
Andreas Norman
if ($media->group->thumbnail && $media->group->thumbnail[0]->attributes()) {
    $attrs = $media->group->thumbnail[0]->attributes();
    $videoobj[$i]['thumb'] = strval($attrs['url']);
    $videoobj[$i]['title'] = strval($media->group->title);
}
21
Björn

SimpleXMLのメソッドは常にオブジェクトを返します。オブジェクト自体は元のドキュメントにリンクされています(libxmlに関連する内部的なものもあります)。後で使用するためにそのデータを保存する場合は、次のように文字列としてキャストします。

$videoobj[$i]['url'] = (string) $attrs['url'];
$videoobj[$i]['thumb'] = (string) $attrs['url']; 
$videoobj[$i]['title'] = (string) $media->group->title;
10
Josh Davis