2011-09-21 48 views
1

我继承了一些PHP代码(但我有点PHP经验)并且找不到如何计算返回的对象中的某些元素simplexml_load_file()PHP如何计算xml元素返回的对象simplexml_load_file(),

的代码是这样的

$xml = simplexml_load_file($feed); 
for ($x=0; $x<6; $x++) { 
    $title = $xml->channel[0]->item[$x]->title[0]; 
    echo "<li>" . $title . "</li>\n"; 
} 

它假定会有至少6个<item>元素,但有时也有减少,所以我得到警告的输出消息对我的开发系统(虽然不是直播)。

如何在$xml->channel[0]中提取计数为<item>的元素?

回答

2

这里有几种选择,从我最到最不喜欢(的那些提供)。

  • 一种选择是利用SimpleXMLIterator的结合LimitIterator

    $xml = simplexml_load_file($feed, 'SimpleXMLIterator'); 
    $items = new LimitIterator($xml->channel->item, 0, 6); 
    foreach ($items as $item) { 
        echo "<li>{$item->title}</li>\n"; 
    } 
    
  • 如果看起来太吓人了,还是没有够吓人的,然后又是抛出的XPath进入组合。

    $xml = simplexml_load_file($feed); 
    $items = $xml->xpath('/rss/channel/item[position() <= 6]'); 
    foreach ($items as $item) { 
        echo "<li>{$item->title}</li>\n"; 
    } 
    
  • 最后,几乎没有改变你现有的代码,也有。

    $xml = simplexml_load_file($feed); 
    for ($x=0; $x<6; $x++) { 
        // Break out of loop if no more items 
        if (!isset($xml->channel[0]->item[$x])) { 
         break; 
        } 
        $title = $xml->channel[0]->item[$x]->title[0]; 
        echo "<li>" . $title . "</li>\n"; 
    } 
    
1

您可以通过计数($ xml)来计数。 我总是做这样的:

$xml = simplexml_load_file($feed); 
foreach($xml as $key => $one_row) { 
     echo $one_row->some_xml_chield; 
    } 
+0

行,但图6是用于显示一个上限,我想我可以使用'如果$计数++> = 6 {打破;循环内部。 – RedGrittyBrick

+0

是的,你可以:) – tasmaniski

+0

嘿,我只是找到函数** simpleXMLToArray ** 那里[链接](http://php.net/manual/en/book.simplexml.php)。 您可以将xml对象传递给此函数并获取数组,并且您可以通过为($ i = 0; $ i> ...){...}传递throw元素 – tasmaniski

2

最简单的方法是使用SimpleXMLElement::count()为:

$xml = simplexml_load_file($feed); 
$num = $xml->channel[0]->count(); 
for ($x=0; $x<$num; $x++) { 
    $title = $xml->channel[0]->item[$x]->title[0]; 
    echo "<li>" . $title . "</li>\n"; 
} 

还要指出的是$xml->channel[0]回报是SimpleXMLElement对象。此类实现Traversable接口,所以我们可以在一个foreach环直接使用它:

$xml = simplexml_load_file($feed); 
foreach($xml->channel[0] as $item { 
    $title = $item->title[0]; 
    echo "<li>" . $title . "</li>\n"; 
}