另一件小事让我抓狂…我想拉在一个RSS提要,并使用PHP显示它。它要求夫人描述(因为它没有附加所有额外的垃圾)。唯一的问题是信息流中有广告。因此,当脚本要求对广告进行媒体描述时(实际上根本没有),整个页面就会失败。
我试过使用continue和if…其他基于长度,但仍然不起作用。
$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>");
}
}
感谢任何指导!
如果没有看到错误消息,我无法确定,但很可能脚本失败是因为这一行:
$item_desc=$x->item($i)->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'description')->item(0)->childNodes->item(0)->nodeValue;
如果没有描述元素,那么getElementsByTagNameNS()
将返回一个空的DOMNodeList
,因此->item(0)->childNodes
将失败。
你需要把这些分开。
$item_desc_nodes = $x->item($i)->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'description');
if ($item_desc_nodes->length) {
$item_desc = $item_desc_nodes->item(0)->childNodes->item(0)->nodeValue;
} else {
continue;
}
老实说,您应该使用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);
}
if ($item_title=="") continue;
使用唯一的问题是提要有广告。所以当脚本要求媒体描述一个广告(为此
:
/*/channel/item[media:description]
,或者:
/*/channel/item[not(title='Advertisement:')]
我个人会使用并推荐上面的第一个表达式