2011-11-26 38 views
2

另一件小事让我发疯了......我想拉入一个RSS feed并使用PHP显示它。它要求对mrss的描述(因为它没有附加所有额外的垃圾)。唯一的问题是Feed中有广告。所以当脚本调用广告的媒体描述(没有广告)时,整个页面都会失败。如果栏位为空,我该如何跳过RSS项目?

我已经使用并继续在if ... else基于长度试过了,但它仍然没有工作..

$xml=("http://feeds.abcnews.com/abcnews/gmavideos"); 
$xmlDoc = new DOMDocument(); 
$xmlDoc->load($xml); 
$x=$xmlDoc->getElementsByTagName('item'); 

for ($i=0; $i<=10; $i++) 
    { 
    $item_title=$x->item($i)->getElementsByTagName('title') 
    ->item(0)->childNodes->item(0)->nodeValue; 
    $item_link=$x->item($i)->getElementsByTagNameNS('http://www.pheedo.com/namespace/pheedo', 'origLink') 
    ->item(0)->childNodes->item(0)->nodeValue; 
    $item_desc=$x->item($i)->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'description') 
    ->item(0)->childNodes->item(0)->nodeValue; 

    if ($x->length == 0) { 
     exit('etc.'); 
    } 
    else { 
    echo ("<p><a href='" . $item_link 
    . "' target='_blank'>" . $item_title . "</a>"); 
    echo ("<br />"); 
    echo ($item_desc . "</p>"); 
    } 
    } 

任何指导赞赏!

回答

3

没有看到错误消息,我不能肯定知道,但最有可能的脚本失败,因为这行:

$item_desc=$x->item($i)->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'description')->item(0)->childNodes->item(0)->nodeValue; 

如果没有描述元素,然后getElementsByTagNameNS()会返回一个空DOMNodeList ,所以->item(0)->childNodes将会失败。

你需要把它们分开。老实说,你应该真的使用XPath而不是getElementsByTagNameNS。但是,老实说,你应该使用XPath,而不是getElementsByTagNameNS。您也应该使用->textContent而不是->childNodes->item(0)->nodeValue

UPDATE:这是我将如何使用XPath

$xml = 'http://feeds.abcnews.com/abcnews/gmavideos'; 
$xmlDoc = new DOMDocument(); 
$xmlDoc->load($xml); 

$xpath = new DOMXPath($xmlDoc); 
$xpath->registerNamespace('media', 'http://search.yahoo.com/mrss/'); 
$xpath->registerNamespace('pheedo', 'http://www.pheedo.com/namespace/pheedo'); 

// filter out the ads in the xpath expression itself by saying there must be 
// a pheedo:origLink element in the item 
$items = $xpath->query('/rss/channel/item[pheedo:origLink][position() < 11]'); 

$linktmpl = '<p><a href="%s" target="_blank">%s</a><br />%s</p>'."\n"; 

foreach($items as $item) { 
    $item_title = $xpath->evaluate('string(title)', $item); 
    $item_link = $xpath->evaluate('string(pheedo:origLink)', $item); 
    $item_desc = $xpath->evaluate('string(media:description)', $item); 

    $escaped = array_map('htmlspecialchars', array($item_link, $item_title, $item_desc)); 
    vprintf($linktmpl, $escaped); 
} 
+0

这真棒谢谢!甚至没有想过使用xpath ... – aspring

0
if ($item_title=="") continue; 
+0

这没有帮助。由于OP的链接而没有检查DOMNodeList是否有任何项目,所以PHP会在完成错误输出前分配$ item_title。 –

+0

呃..不,它不会。你需要在你的示波器中使用它。 –

+0

如果您运行OP的代码,当循环到达“广告”项时会出现此错误:PHP致命错误:在第12行的rss_item_test.php中的非对象上调用成员函数item()。因此,从来没有空白的'$ item_title'来测试 - 它还没有被分配,因为右侧在它遇到致命错误之前还没有完成评估。 –

0

The only problem is that the feed has advertisements. So when the script calls for the media description of an advertisement (for which there is none), the whole page fails.

使用完成相同的任务:

/*/channel/item[media:description] 

,或者

/*/channel/item[not(title='Advertisement:')] 

我个人会使用和推荐上面的第一个表达式。

相关问题