Цикл по объекту SimpleXMLElement работает только в 2 этапа - PullRequest
2 голосов
/ 27 октября 2010

У меня есть SimpleXMLElement, для которого я читаю в XML-файле, используя curl.Пытаясь извлечь из него значения, мне, кажется, нужно использовать вложенный 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 Ответ

1 голос
/ 27 октября 2010

Вы должны использовать:

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

Поскольку коллекция элементов находится внутри тегов <rss> и <channel> (тег <rss> можно опустить, поскольку он является корневым узломdocument).

С другой стороны: если вы не делаете ничего необычного, вам, вероятно, не нужно использовать curl для получения XML-содержимого RSS-каналов.Просто используйте simplexml_load_file с URL-адресом в качестве аргумента:

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