如何使用PHP解析XML的媒体:内容?

时间:2016-03-08 20:07:35

标签: php xml rss

我找到了一个关于如何完成大部分工作的精彩教程:

https://www.developphp.com/video/PHP/simpleXML-Tutorial-Learn-to-Parse-XML-Files-and-RSS-Feeds

但我无法理解如何提取媒体:来自Feed的内容图片。我已经阅读了尽可能多的信息,但我仍然坚持。

ie:How to get media:content with SimpleXML 这建议使用:

foreach ($xml->channel->item as $news){
    $ns_media = $news->children('http://search.yahoo.com/mrss/');
    echo $ns_media->content; // displays "<media:content>"}

但是我无法让它发挥作用。

这是我的脚本和Feed,我试图解析:

<?php
$html = "";
$url = "http://rssfeeds.webmd.com/rss/rss.aspx?RSSSource=RSS_PUBLIC";
$xml = simplexml_load_file($url);
for($i = 0; $i < 10; $i++){
    $title = $xml->channel->item[$i]->title;
    $link = $xml->channel->item[$i]->link;
    $description = $xml->channel->item[$i]->description;
    $pubDate = $xml->channel->item[$i]->pubDate;

    $html .= "<a href='$link'><h3>$title</h3></a>";
    $html .= "$description";
    $html .= "<br />$pubDate<hr />";
}
echo $html;
?>

我不知道将此代码添加到脚本中的位置以使其正常工作。老实说,我浏览了几个小时,但找不到可以解析媒体的工作脚本:内容。

有人可以帮忙吗?

========================

更新:

Thanx to fusion3k,我得到了最终的代码:

<?php
$html = "";
$url = "http://rssfeeds.webmd.com/rss/rss.aspx?RSSSource=RSS_PUBLIC";
$xml = simplexml_load_file($url);
for($i = 0; $i < 5; $i++){

    $image = $xml->channel->item[$i]->children('media', True)->content->attributes();
    $title = $xml->channel->item[$i]->title;
    $link = $xml->channel->item[$i]->link;
    $description = $xml->channel->item[$i]->description;
    $pubDate = $xml->channel->item[$i]->pubDate;

    $html .= "<img src='$image' alt='$title'>";
    $html .= "<a href='$link'><h3>$title</h3></a>";
    $html .= "$description";
    $html .= "<br />$pubDate<hr />";
}
echo $html;
?>

基本上我需要的就是这条简单的路线:

$image = $xml->channel->item[$i]->children('media', True)->content->attributes();

无法相信非技术人员在阅读了数十篇帖子和文章后在线查找此信息非常困难。好吧,希望这对我这样的其他人有用:)。

2 个答案:

答案 0 :(得分:7)

获取&#39; url&#39;属性,使用->attribute()语法:

$ns_media = $news->children('http://search.yahoo.com/mrss/');

/* Echoes 'url' attribute: */
echo $ns_media->content->attributes()['url'];
// in php < 5.5: $attr = $ns_media->content->attributes(); echo $attr['url'];

/* Catches 'url' attribute: */
$url = $ns_media->content->attributes()['url']->__toString();
// in php < 5.5: $attr = $ns_media->content->attributes(); $url = $attr['url']->__toString();

命名空间说明:

->children()参数不是XML的URL,而是Namespace URI。

XML命名空间用于在XML文档中提供唯一命名的元素和属性:

<xxx>       Standard XML tag
<yyy:zzz>   Namespaced tag
 └┬┘ └┬┘
  │   └──── Element Name
  └──────── Element Prefix (Namespace Identifier)

因此,在您的情况下,<media:content>是命名空间“媒体”的“内容”元素。 Namespaced元素必须具有关联的Namespace URI,作为父节点的属性,或者 - 最常见的 - 是根元素的属性:此属性的格式为xmlns:yyy="NamespaceURI"(在您的情况下为xmlns:media="http://search.yahoo.com/mrss/"作为根节点的属性<rss>)。

最终,上面的$news->children( 'http://search.yahoo.com/mrss/' )表示“使用http://search.yahoo.com/mrss/检索所有子元素作为名称空间URI;另一种 - 最容易理解的 - 语法是:$news->children( 'media', True )True表示“被视为前缀”)。

返回示例中的代码,检索前缀为media的所有第一项子项的通用语法为:

$xml = simplexml_load_file( 'http://rssfeeds.webmd.com/rss/rss.aspx?RSSSource=RSS_PUBLIC' );
$xml->channel->item[0]->children( 'http://search.yahoo.com/mrss/' );

或(相同的结果):

$xml = simplexml_load_file( 'http://rssfeeds.webmd.com/rss/rss.aspx?RSSSource=RSS_PUBLIC' );
$xml->channel->item[0]->children( 'media', True );

您的新代码:

如果您想在页面中显示每个元素的<media:content url>缩略图,请以这种方式修改原始代码:

(...)
$pubDate = $xml->channel->item[$i]->pubDate;
$image   = $xml->channel->item[$i]->children( 'media', True )->content->attributes()['url'];
// in php < 5.5:
// $attr  = $xml->channel->item[$i]->children( 'media', True )->content->attributes();
// $image = $attr['url'];

$html   .= "<a href='$link'><h3>$title</h3></a>";
$html   .= "<img src='$image' alt='$title'>";
(...)

答案 1 :(得分:4)

像我这样的新手的简单例子:

$url = "https://www.youtube.com/feeds/videos.xml?channel_id=UCwNPPl_oX8oUtKVMLxL13jg";
$rss = simplexml_load_file($url);

foreach($rss->entry as $item) {

  $time = $item->published;
  $time = date('Y-m-d \ H:i', strtotime($time));

  $media_group = $item->children( 'media', true );
  $title = $media_group->group->title;
  $description = $media_group->group->description;
  $views = $media_group->group->community->statistics->attributes()['views'];
}
echo $time . ' :: ' . $title . '<br>' . $description . '<br>' . $views . '<br>';