PHP的SimpleXMLElement :: children()究竟返回了什么?

时间:2011-07-23 12:26:46

标签: php simplexml

根据manual

  

返回SimpleXMLElement元素,无论节点是否有子节点。

但首先,这对我来说没有意义。 children()肯定会返回一个SimpleXMLElements数组。如果节点有多个子节点,那么如何返回单个SimpleXMLElement可能代表该节点?

其次,这与手册中的示例无关:

foreach ($xml->children() as $second_gen)
   echo ' The person begot a ' . $second_gen['role'];

你如何通过SimpleXMLElement进行预告?我以为你只能用阵列做到这一点?另外,$ second_gen值是怎么回事?所以children()返回一个关联数组数组......?

这里必须有一些深入的PHP语法规则,我不知道,所以请解释或指向相关的手册页。

2 个答案:

答案 0 :(得分:4)

为什么不亲自尝试(demo):

$foo = new SimpleXmlElement(
'<foo>
    <bar>
        <baz id="b1"/>
        <baz id="b2"/>
        <baz id="b3"/>
    </bar>
</foo>
');

然后做

var_dump($foo->bar->baz[0]->children());

输出

object(SimpleXMLElement)#4 (0) {}

然后做

var_dump($foo->bar->children());

输出

object(SimpleXMLElement)#2 (1) {
  ["baz"]=>
  array(3) {
    [0]=>
    object(SimpleXMLElement)#3 (0) {
    }
    [1]=>
    object(SimpleXMLElement)#5 (0) {
    }
    [2]=>
    object(SimpleXMLElement)#6 (0) {
    }
  }
}
  

你如何通过SimpleXMLElement进行预告?我以为你只能用数组做到这一点?

嗯,那是错的。您可以预先处理任何Traversable(例如对象和数组等)以及实现Iterator接口的任何对象。这是SimpleXmlElement

的类签名
Class [ <internal:SimpleXML> <iterateable> class SimpleXMLElement implements Traversable ] {
  

另外,$ second_gen值是怎么回事?所以children()返回一个关联数组数组......?

不,它没有。它返回SimpleXmlElement。通过Array Access访问SimpleXmlElement从当前节点获取属性(或者如果是数字,则按位置访问子节点),例如

echo $foo->bar->baz[2]['id']; // prints "b3"

这有些不明显,因为SimpleXmlElement没有实现ArrayAccess,但它是implemented in C的方式。有关更多示例,请参阅http://www.php.net/manual/en/simplexml.examples-basic.php

答案 1 :(得分:1)

来自手册

  

注意:SimpleXML制定了向大多数添加迭代属性的规则   方法。无法使用var_dump()或其他任何内容查看它们   可以检查对象。

这只意味着可以迭代返回的对象。因此,即使您获得了一个对象,您也可以遍历它。

只需看看课程定义:http://www.php.net/manual/en/class.simplexmlelement.php (注意它实现了traversable

由于您遍历的每个对象本身都是一个SimpleXML对象,因此您只需在其上调用children()即可更深入一级。