我正在尝试使用php中的simplexml_load_file解析这个YouTube XML。
XML提要可以在以下位置找到:https://www.youtube.com/feeds/videos.xml?playlist_id=PL1mm1FfX5EHRjGyoBpEXBRIGAmCNt8pBT
下面在php中,我试图遍历嵌套在每个入口节点中的媒体组。
<?php
$xmlFeed=simplexml_load_file('https://www.youtube.com/feeds/videos.xml?playlist_id=PL1mm1FfX5EHRjGyoBpEXBRIGAmCNt8pBT')
or die("Cannot load YouTube video feed, please try again later.");
foreach ($xmlFeed->entry->children('media', true)->group as $video) {
echo $video->title;
echo $video->description;
echo $video->thumbnail->getNameSpaces(true);
}
?>
标题和描述打印得很好。但我正在尝试获取在这个名称空间中找到的缩略图URL:
<media:thumbnail url="https://i1.ytimg.com/vi/HEYQXVGnwXc/hqdefault.jpg" width="480" height="360"/>
我已经尝试了以下三种方法:
echo $video->thumbnail->getNameSpaces(true);
echo $video->thumbnail->getNameSpaces(true)['url'];
echo $video->thumbnail->getNameSpaces(true)->url;
无返回url。第一个返回Array,最后两个为空。我错过了什么?
有几件事:首先,您必须使用attributes()函数,因为缩略图没有子级。其次,您不需要声明getNameSpaces(true)
,因为名称空间前缀media
是在for
循环中完成的。最后,您不需要在所有media:group
上进行迭代。现在,您将只返回第一组xml值,而不是从每个<entry>
节点同时返回这两个值。因此,您需要添加一个外循环,它在<entry>
节点的频率上进行迭代。
$attr = 'url';
for($i = 0; $i < sizeof($xmlFeed->entry); $i++) {
foreach ($xmlFeed->entry[$i]->children('media', true)->group as $video) {
echo $video->title."'n";
echo $video->description."'n";
echo $video->thumbnail->attributes()->$attr."'n";
}
}
XPATH替代
更进一步,您可以通过简单地注册媒体名称空间并查询确切的位置来处理XPath中的需求,当然也可以在每个集合中迭代:
$xmlFeed->registerXPathNamespace('media', 'http://search.yahoo.com/mrss/');
// ARRAYS TO HOLD XML VALUES
$videos = $xmlFeed->xpath('//media:group');
$title = $xmlFeed->xpath('//media:group/media:title');
$description = $xmlFeed->xpath('//media:group/media:description');
$url = $xmlFeed->xpath('//media:group/media:thumbnail/@url');
// ITERATING THROUGH EACH ARRAY
for($i = 0; $i < sizeof($videos); $i++) {
echo $title[$i]."'n";
echo $description[$i]."'n";
echo $url[$i]."'n";
}