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


Getting name spaces out of XML from simplexml_load_file in php

我正在尝试使用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";        
}