错误:循环中的非对象上的getElementsByTagName()

时间:2014-12-31 06:18:38

标签: javascript php xml rss

我正在做一个RSS阅读器:

..
..
$xmlDoc = new DOMDocument();

$xmlDoc->load($xml);

$x=$xmlDoc->getElementsByTagName('item');


  for ($i=$j=0; $i<=5; $i++) {




          $item_title=$x->item($i)->getElementsByTagName('title')
          ->item(0)->nodeValue;
..
..

}

我将数字限制为5,但是某些xml包含少于5项,所以我收到错误

Fatal error: Call to a member function getElementsByTagName() on a non-object 

我可以做$ ilength但是由于图像负载过重,我必须限制数量。如何解决上面的错误?

4 个答案:

答案 0 :(得分:0)

for ($i=$j=0; $i<=5; $i++) {
 ..
 ..
 $xmlDoc = new DOMDocument();

 if ($xmlDoc->load($xml)) { // do the stuffs if file is loaded

   $x=$xmlDoc->getElementsByTagName('item');
   $item_title=$x->item($i)->getElementsByTagName('title')
   ->item(0)->nodeValue;
   ..
   ..
 }
}

修改

if(is_object($x->item($i))) { // check if the loaded item is object.
  $item_title=$x->item($i)->getElementsByTagName('title')
  ->item(0)->nodeValue;
}

答案 1 :(得分:0)

所以基于循环关闭5和项目数。

不确定语法但是JS会是

for ($i=$j=0; $i<=5 && $i<$x.length ; $i++) {

答案 2 :(得分:0)

尝试将代码更改为:

$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);
$x=$xmlDoc->getElementsByTagName('item');
$ct = ( count($x)<=5 ) ? count($x) : 5;
for ($i=$j=0; $i<=$ct; $i++) {

答案 3 :(得分:0)

您希望5作为最大索引:

$m = 5;
for ($i = 0; $i <= $m; $i++) { ...

但只有当它大于结果$x中的元素数量减去一个时:

$m = min(5, $x->length);

有关方便的min()功能的更详细说明,请参阅http://php.net/min

除此之外,使用foreachLimitIterator通常要容易得多:

$items   = $xmlDoc->getElementsByTagName('item');
$limited = new LimitIterator(new IteratorIterator($items), 0, 5);
foreach ($limited as $item) {
    # ... just operate on $item ...
}

循环内部不会再有任何无效$item自动出现。而且您的代码可能会更具表现力,更易于阅读和修改。