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


SimpleXML iteration only outputs first child element

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

饲料——

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;
}

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

SimpleXML可能看起来很神奇,但它并没有神奇到您不必调整它以匹配您正在阅读的XML。

你的问题在这里包含了它自己的答案的萌芽:

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

你要找的只是一个嵌套循环:从你所描述的(问题中没有太多细节)你有多个"条目",每个包含多个"项"。因此,在您现有的遍历条目的循环中,您需要另一个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