SimpleXML迭代仅输出第一个子元素

时间:2014-07-17 11:44:00

标签: php foreach simplexml

我有一个XML源,我想循环并显示它的所有子元素,但由于某种原因我只能输出第一个,

Feed -

SimpleXMLElement Object
(
    [title] => Lorem Ipsum
    [description] => Overall description
    [link] => http://someurl.com
    [pubDate] => Thu, 17 Jul 2014 10:49:09 +0000
    [ttl] => 123
    [item] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [title] => Lorem Ipsum Dolor 2
                    [link] => http://someurl.com
                    [description] => SimpleXMLElement Object
                        (
                        )

                    [pubDate] => Thu, 17 Jul 2014 10:49:09 +0000
                    [guid] => http://www.someurl.com
                )

            [1] => SimpleXMLElement Object
                (
                    [title] => Lorem Ipsum Dolor 1
                    [link] => http://someurl.com
                    [description] => SimpleXMLElement Object
                        (
                        )

                    [pubDate] => Thu, 17 Jul 2014 10:24:51 +0000
                    [guid] => http://someurl.com
                )
          ETC
  )
)

PHP -

$entries = simplexml_load_file($feed);

foreach ($entries as $entry) {
    echo $entry->item->description;
}

不幸的是我不能影响feed的结构,所以我需要以某种方式迭代并在item元素处开始我的循环。想法?

1 个答案:

答案 0 :(得分:1)

SimpleXML看似神奇,但它不是那么神奇,你不必修改它以匹配你正在阅读的XML。

你的问题包含了自己答案的细菌:

  

不幸的是,我不能影响feed的结构,所以我需要以某种方式迭代并在item元素处开始我的循环。想法?

您正在寻找的并不比嵌套循环更复杂:根据您所描述的内容(问题中没有太多详细信息)您有多个"条目& #34;,每个包含多个"项目"。因此,在现有的条目循环中,您需要另一个foreach循环来依次访问每个item

$entries = simplexml_load_file($feed);

foreach ($entries as $entry) {
    foreach ($entry->item as $item) {
        echo $item->description;
    }
}

请注意,您有$entry->item->description的位置,这是返回第一个节点; SimpleXML允许您将其写为$entry->item[0]->description的简写 - 即具有该名称的第一个子项。现在它已经迭代$entry->item将改为引用具有该名称的所有孩子的列表,每个孩子将依次分配给$item