XML Feeds& PHP - 限制项目数量

时间:2011-10-24 14:08:54

标签: php xml arrays

我正在浏览BBC新闻XML Feed。但我想做的是将它限制为8或10项饲料。

我怎样才能做到这一点?

我的代码是:

<?php

  $doc = new DOMDocument();
  $doc->load('http://feeds.bbci.co.uk/news/rss.xml');
  $arrFeeds = array();
  foreach ($doc->getElementsByTagName('item') as $node) {
    $itemRSS = array ( 
      'title' => $node->getElementsByTagName('title')->item(0)->nodeValue,
      'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue,
      'link' => $node->getElementsByTagName('link')->item(0)->nodeValue,
      'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue
      );
?>

<h2><a href="<?php echo $itemRSS['link'] ;?>"><?php echo $itemRSS['title']; ?></a></h2>
<?php  } ?>

提前致谢..

3 个答案:

答案 0 :(得分:7)

使用XPath,您可以轻松检索RSS提要的子集。

$itemCount = 10;
$xml = simplexml_load_file('http://feeds.bbci.co.uk/news/rss.xml');
$items = $xml->xpath(sprintf('/rss/channel/item[position() <= %d]', $itemCount));
foreach ($items as $i) {
    $itemRSS = array ( 
        'title' => (string)$i->title,
        'desc' => (string)$i->description,
        'link' => (string)$i->link,
        'date' => (string)$i->pubDate
    );
}

通过DOM对象交换SimpleXML对象,你会更加轻量级 - 而XPath更容易与SimpleXML一起使用(这就是我在这个例子中使用它的原因) 。使用DOM可以实现同样的目的:

$doc = new DOMDocument();
$doc->load('http://feeds.bbci.co.uk/news/rss.xml');
$xpath = new DOMXpath($doc);
$items = $xpath->query(sprintf('/rss/channel/item[position() <= %d]', $itemCount));
foreach ($items as $i) {
    // ...
}

答案 1 :(得分:5)

取一个计数器变量,每次迭代加1,检查计数器是否达到上限,然后退出循环。

$cnt=0;
foreach ($doc->getElementsByTagName('item') as $node) {
    if($cnt == 8 ) {
       break;
     }    
    $itemRSS = array ( 
      'title' => $node->getElementsByTagName('title')->item(0)->nodeValue,
      'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue,
      'link' => $node->getElementsByTagName('link')->item(0)->nodeValue,
      'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue
      );
      $cnt++;
?>    
<h2><a href="<?php echo $itemRSS['link'] ;?>"><?php echo $itemRSS['title']; ?></a></h2>
<?php 
} ?>

答案 2 :(得分:2)

使用SimpleXml执行此操作时,您还可以使用array_slice

$rss = simplexml_load_file('http://feeds.bbci.co.uk/news/rss.xml');
$items = $rss->xpath('/rss/channel/item');
$startAtItem = 0;
$numberOfItems = 9;
$firstTenItems = array_slice($items, $startAtItem, $numberOfItems);

或使用LimitIterator

$rss = simplexml_load_file('http://feeds.bbci.co.uk/news/rss.xml');
$items = $rss->xpath('/rss/channel/item');
$startAtItem = 0;
$numberOfItems = 9;
$firstTenItems = new LimitIterator(
    new ArrayIterator($items), $startAtItem, $numberOfItems
);
foreach ($firstTenItems as $item) { …

更优雅的是此网站上其他地方提供的XPath position()解决方案。