2011-12-11 96 views
1

使用Zend_Feed庫進行超過一個深度的項目的正確方法是什麼?Zend_Feed:從Feed中獲取圖片URL

第二行到最後一行代碼應該如何讀取?

require_once 'Zend/Feed/Rss.php'; 

$url = 'http://leo.am/podcasts/twit'; 
$c = new Zend_Feed_Rss($url); 
$iu = $c->image()->url(); 
echo $iu; 

回答

1

這很有趣!

你的RSS源有兩個image標籤都有效:

<image> 
    <url>http://leoville.tv/podcasts/coverart/twit144audio.jpg</url> 
    <!-- ... more stuff ... --> 
</image> 
<!-- ... more stuff ... --> 
<itunes:image href="http://leoville.tv/podcasts/coverart/twit600audio.jpg"/> 

第一image是在默認的命名空間,並具有子節點,這可能是你想要的。第二個顯然是iTunes特定的,因此在itunes名稱空間中,URL在href屬性中。

問題是$c->image返回數組中的兩個元素。我不確定它是否是一個錯誤,或者它是否按預期工作。

所以你必須遍歷每個元素,看看它是從iTunes還是從RSS。只要定義了該代碼,該代碼就會返回數組中的itunes和rss圖像url。如果沒有找到該數組爲空:

require_once 'Zend/Feed/Rss.php'; 

// iTunes Namespace URI 
define('RSS_NS_ITUNES', 'http://www.itunes.com/dtds/podcast-1.0.dtd'); 

function getImageFromElement(Zend_Feed_Element $elem) { 
    $result = array(); 
    $elemDOM = $elem->getDOM(); 
    if(RSS_NS_ITUNES == $elemDOM->namespaceURI) { 
     $result["itunes"] = $elemDOM->getAttribute('href'); 
    } else if("" == $elemDOM->namespaceURI) { 
     $url = $elem->url(); 
     if($url) 
      $result["rss"] = $url; 
    } 

    return $result; 
} 

function getFeedImages(Zend_Feed_Rss $feed) { 
    $imgContent = $feed->image; 
    $result = array(); 

    if(is_array($imgContent)) { 
     // Multiple elements returned 
     // check every element for valid URLs 
     foreach($imgContent as $i) { 
      $result = array_merge($result, 
       getImageFromElement($i)); 
     } 
    } else if($imgContent instanceof Zend_Feed_Element) { 
     // Check the one element we've got 
     $result = getImageFromElement($imgContent); 
    } 

    return $result; 
} 


// usage: 
$url = 'http://leo.am/podcasts/twit'; 
$c = new Zend_Feed_Rss($url); 
$imageUrls = getFeedImages($c); 
var_dump($imageUrls); 

輸出看起來是這樣的:

array(2) { 
    ["rss"]=> 
    string(53) "http://leoville.tv/podcasts/coverart/twit144audio.jpg" 
    ["itunes"]=> 
    string(53) "http://leoville.tv/podcasts/coverart/twit600audio.jpg" 
} 

編輯: 以及有一個簡潔的選擇,如果你不關心的iTunes網址:

$url = 'http://leo.am/podcasts/twit'; 
$c = new Zend_Feed_Rss($url); 
$imgNoNs=":image"; 
echo $c->$imgNoNs->url(); 

輸出:

http://leoville.tv/podcasts/coverart/twit144audio.jpg 
0

我這樣做:

$feed = Zend_Feed::import('http://www.sports.ru/rss/all_news.xml'); 

$data = array(); 
foreach ($feed as $entry) 
{ 
    $data[] = array(
     'title' => $entry->title(), 
     'description' => $entry->description(), 
     'image' => $entry->enclosure->getDom()->getAttribute('url'), 
    ); 
}