MRSS feed中的命名空间使用simplexml PHP脚本

时间:2014-10-14 19:41:58

标签: php xml parsing simplexml

试图研究我在这里做错了什么,但到目前为止还没有运气。我想使用此脚本提取此MRSS Feed中的链接和URL,但它无法正常工作。我认为我需要做的就是使用命名空间来获取子元素,但没有运气:

<?php
$html = "";
$url = "http://feeds.nascar.com/feeds/video?command=search_videos&media_delivery=http&custom_fields=adtitle%2cfranchise&page_size=100&sort_by=PUBLISH_DATE:DESC&token=217e0d96-bd4a-4451-88ec-404debfaf425&any=franchise:%20Preview%20Show&any=franchise:%20Weekend%20Top%205&any=franchise:Up%20to%20Speed&any=franchise:Press%20Pass&any=franchise:Sprint%20Cup%20Practice%20Clips&any=franchise:Sprint%20Cup%20Highlights&any=franchise:Sprint%20Cup%20Final%20Laps&any=franchise:Sprint%20Cup%20Victory%20Lane&any=franchise:Sprint%20Cup%20Post%20Race%20Reactions&any=franchise:All%20Access&any=franchise:Nationwide%20Series%20Qualifying%20Clips&any=franchise:Nationwide%20Series%20Highlights&any=franchise:Nationwide%20Series%20Final%20Laps&any=franchise:Nationwide%20Series%20Victory%20Lane&any=franchise:Nationwide%20Series%20Post%20Race%20Reactions&any=franchise:Truck%20Series%20Qualifying%20Clips&any=franchise:Truck%20Series%20Highlights&any=franchise:Truck%20Series%20Final%20Laps&any=franchise:Truck%20Series%20Victory%20Lane&any=franchise:Truck%20Series%20Post%20Race%20Reactions&output=mrss";
$xml = simplexml_load_file($url);
$namespaces = $xml->getNamespaces(true); // get namespaces

for($i = 0; $i < 50; $i++){ // will return the 50 most recent videos 
  $title = $xml->channel->item[$i]->title;
  $link = $xml->channel->item[$i]->link;
  $pubDate = $xml->channel->item[$i]->pubDate;
  $description = $xml->channel->item[$i]->description;
  $titleid = $xml->channel->item[$i]->children($namespaces['bc'])->titleid;
  $url = $xml->channel->item[$i]->children($namespaces['media'])->url;
  $html .= "<h3>$title</h3>$description<p>$pubDate<p>$link<p>Video ID: $titleid<p>
    <iframe width='480' height='270' src='http://link.brightcove.com/services/player/bcpid3742068445001?bckey=//my API token goes here &bctid=$titleid&autoStart=false' frameborder='0'></iframe><hr/>";/* this embed code is from the youtube iframe embed code format but is actually using the embedded Ooyala player embedded on the Campus Insiders page. I replaced any specific guid (aka video ID) numbers with the "$guid" variable while keeping the Campus Insider Ooyala publisher ID, "eb3......fad" */
}
echo $html;
?>

我认为这不是正确的方法:

$url = $xml->channel->item[$i]->children($namespaces['media'])->url;

我在这里做错了什么?

感谢您的帮助!

  • MD

1 个答案:

答案 0 :(得分:0)

SimpleXML被欺骗性地命名,因为它比DOMDocument或其他PHP XML扩展更难使用。要获取该网址,您需要访问url节点的media:content属性:

<media:content duration="95" medium="video" type="video/mp4"
 url="http://brightcove.meta.nascar.com.edgesuite.net/vod/etc"/>

使用

定位第一个<media:content>节点
$xml->channel->item[$i]->children($namespaces['media'])->content[0]

并获取其属性:

$m_attrs = 
  $xml->channel->item[$i]->children($namespaces['media'])->content[0]->attributes();

然后,您可以访问url属性:

echo "URL: " . $m_attrs["url"] . "\n";

您的代码应该是:

$titleid = $xml->channel->item[$i]->children($namespaces['bc'])->titleid;
$m_attrs = $xml->channel->item[$i]->children($namespaces['media'])->content[0]->attributes();
$url = $m_attrs["url"];

$html .= "<h3>$title</h3>$description<p>$pubDate<p>$link<p>Video ID: $titleid<p> (etc.)";