How to Parse XML's Media:Content with PHP?

社会主义新天地 提交于 2019-12-01 05:19:05

To get 'url' attribute, use ->attribute() syntax:

$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();

Namespaces explanation:

The ->children() arguments is not the URL of your XML, it is a Namespace URI.

XML namespaces are used for providing uniquely named elements and attributes in an XML document:

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

So, in your case, <media:content> is the “content” element of Namespace “media”. Namespaced elements must be have an associated Namespace URI, as attribute of a parent node or — most commonly — of the root element: this attribute has the form xmlns:yyy="NamespaceURI" (in your case xmlns:media="http://search.yahoo.com/mrss/" as attribute of root node <rss>).

Ultimately, the above $news->children( 'http://search.yahoo.com/mrss/' ) means “retrieve all children elements with http://search.yahoo.com/mrss/ as Namespace URI; an alternative — most intelligible — syntax is: $news->children( 'media', True ) (True means “regarded as a prefix”).

Returning to the code in example, the generic syntax to retrieve all first item's children with prefix media is:

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

or (identical result):

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

Your new code:

If you want to show the <media:content url> thumbnail for each element in your page, modify the original code in this way:

(...)
$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'>";
(...)

Simple example for newbs like me:

$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>';
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!