我正在尝试使用php中的simplexml_load_file解析此YouTube XML。
可以在此处找到XML Feed: https://www.youtube.com/feeds/videos.xml?playlist_id=PL1mm1FfX5EHRjGyoBpEXBRIGAmCNt8pBT
下面在php中我试图遍历嵌套在每个入口节点内的媒体组。
function resize() {
width = parseInt(d3.select("#mychart").style("width")) - margin.left - margin.right,
height = parseInt(d3.select("#mychart").style("height")) - margin.top - margin.bottom;
x.rangePoints([0, width], 1);
d3.values(y).forEach(function(scale) {
scale.range([height, 0])
})
svg.selectAll(".line").attr("d", path);
g = svg.selectAll(".dimension")
.attr("transform", function(d) {
return "translate(" + x(d) + ")";
});
g.selectAll(".axis").call(axis.scale(y[d]))
}
标题和说明打印得很好。但我正试图获取此命名空间中的缩略图URL:
<?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);
}
?>
我已经尝试了以下所有3项内容:
<media:thumbnail url="https://i1.ytimg.com/vi/HEYQXVGnwXc/hqdefault.jpg" width="480" height="360"/>
没有返回网址。第一个返回Array,后两个是空白。我错过了什么?
答案 0 :(得分:1)
有几点:首先,您必须使用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";
}