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

前端 未结 2 432
南旧
南旧 2021-01-05 14:10

I\'ve found a great tutorial on how to accomplish most of the work at:

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

相关标签:
2条回答
  • 2021-01-05 15:07

    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'>";
    (...)
    
    0 讨论(0)
  • 2021-01-05 15:08

    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>';
    
    0 讨论(0)
提交回复
热议问题