从php中的simplexml_load_file获取XML中的名称空间

时间:2015-11-21 19:00:57

标签: php xml

我正在尝试使用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,后两个是空白。我错过了什么?

1 个答案:

答案 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";        
}