如果字段为空,如何跳过RSS项?

时间:2011-11-26 21:16:46

标签: php xpath rss domdocument

另一件小事让我疯狂......我想引入RSS源并使用PHP显示它。它询问了mrss decription(因为它没有附加所有额外的垃圾)。唯一的问题是饲料有广告。因此,当脚本调用广告的媒体描述时(没有广告),整个页面都会失败。

我尝试过使用continue和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 个答案:

答案 0 :(得分:3)

没有看到我无法确定的错误消息,但很可能因为这行而脚本失败了:

$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

更新:这是我使用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);
}

答案 1 :(得分:0)

if ($item_title=="") continue;

答案 2 :(得分:0)

  

唯一的问题是Feed有广告。所以当   脚本调用广告的媒体描述(为此   没有),整个页面都失败了。

使用

/*/channel/item[media:description]

或者

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

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