PHP SimpleXMLIterator

时间:2013-02-06 14:45:05

标签: php

我正在使用SimpleXMLIterator来解析一些XML。 执行print_r表明从XML创建的SimpleXMLIterator对象如下所示: {

[@attributes] => Array
    (
        [id] => abc
        [type] => a
        [timestamp] => 2001-12-12
    )

[place] => US
[name] => Pete
[dob] => SimpleXMLIterator Object
    (
        [dd] => 03
        [mm] => 05
        [yyyy] => 1973
    )

}

还包含dob SimpleXMLIterator对象 - 即XML标记的子元素。

我使用以下代码迭代此对象,这是反复发生的,因为我无法确定每个XML标记的深度:

function _prepareSimpleXMLIteratorObj(SimpleXMLIterator $xmlIterator) {

foreach ($xmlIterator as $key => $value){
    // Count returns the number of children
    if ($value->count() > 0) {      
        $this->_prepareSimpleXMLIteratorObj($value);
    } else {
        $this->assocArray[$key] = (string)$value;
    }
}
}

assocArray是该类的成员变量。 这将从Object生成一个assoc数组。

问题是当我使用$ value-> hasChildren()而不是$ value-> count()我得到假,即使$ value-> count()为dob返回3?我做错了什么想法? 如果是的话

if (($value instanceof SimpleXMLIterator))

我得到假,即使dob显然是SimpleXMLIterator对象?

这种方法有效,但我只是想知道hasChildren和instanceof?

以下是Sample XML

<tag id="abc" type="a" timestamp="2001-12-12">
    <place>US</place>
    <name>Pete</name>
    <dob>
        <dd>03</dd>
        <mm>05</mm>
        <yyyy>1973</yyyy>
    </dob>
</tag>

由于

1 个答案:

答案 0 :(得分:3)

hasChildren方法不适合您,因为它没有按照您的想法进行操作。关键在于文档中的这一行:

  

此方法检查当前的SimpleXMLIterator元素是否具有子元素。

当它表示“current”时,它表示 current()函数返回的实际SimpleXMLElement,就好像您正在使用foreach进行迭代一样。请记住,SimpleXMLIterator被设计为“迭代器”

因此,当您的算法到达dob节点并且您调用$ value-&gt; hasChildren()时,它会真正检查项$ value-&gt; current()是否有子节点。因此,在您的示例中,它检查节点/标记/ dob / dd是否有任何子节点,而不是。