循环使用SimpleXMLElement对象仅适用于两个步骤

时间:2010-10-27 16:46:30

标签: php simplexml

我有一个SimpleXMLElement,我使用curl读取了一个XML文件。 试图从中获取值我似乎需要使用嵌套的foreach,但在类似的情况下我能够一次性完成这项工作。现在我真的很好奇为什么这不起作用:

它美味的RSS提要;

SimpleXMLElement Object
(
    [title] => Delicious/chrisvdberge
    [link] => http://www.delicious.com/chrisvdberge
    [description] => bookmarks posted by chrisvdberge
    [item] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [title] => Diagrammr
                    [pubDate] => Thu, 06 May 2010 12:40:07 +0000
                    [guid] => http://www.delicious.com/url/2fc2ed0e870ec9d001b645dfaed0e771#chrisvdberge
                    [link] => http://www.diagrammr.com/
                    [comments] => http://www.delicious.com/url/2fc2ed0e870ec9d001b645dfaed0e771
                    [source] => chrisvdberge's bookmarks
                    [category] => Array
                        (
                            [0] => tagthis
                            [1] => visualization
                            [2] => diagrams
                        )

                )

            [1] => SimpleXMLElement Object
                (
                    [title] => Ignite Toronto 2: Ryan Coleman - Designing for visual efficiency on Vimeo
                    [pubDate] => Mon, 18 Jan 2010 08:05:06 +0000
                    [guid] => http://www.delicious.com/url/9a0de307f3f37baaa25ad20b4dbc4537#chrisvdberge
                    [link] => http://vimeo.com/8317770
                    [comments] => http://www.delicious.com/url/9a0de307f3f37baaa25ad20b4dbc4537
                    [source] => chrisvdberge's bookmarks
                    [category] => Array
                        (
                            [0] => tagthis
                            [1] => vizthink
                        )

                )

等。

我可以使用嵌套的foreach访问所有链接:

foreach ($delicious_res as $item) {
    foreach ($item->item as $entry){
        echo $entry->link."<br />";
    }
}

但我不明白为什么我不能使用它(我可以在另一种情况下使用)

foreach ($delicious_res->item as $item) {
        echo $entry->link."<br />";
}

我真的很想理解为什么要更好地理解SimpleXML;)

1 个答案:

答案 0 :(得分:1)

你必须使用:

foreach($delicious_res->channel->item as $item) {
    print_r($item);
}

因为项目集合在<rss><channel>标记内(<rss>标记可以省略,因为它是文档的根节点。)

另一方面说明:如果你没有做任何花哨的事情,你可能不需要使用curl来获取rss feed xml内容。只需使用simplexml_load_file将url作为参数:

$delicious_res = simplexml_load_file('http://path-to-your/file.xml"');