2

我正在使用 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 Object - 即 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 生成一个关联数组。

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

if (($value instanceof SimpleXMLIterator))

我得到了错误,即使 dob 显然是一个 SimpleXMLIterator 对象?

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

这是示例 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>

谢谢

4

1 回答 1

3

hasChildren 方法对你不起作用,因为它没有按照你的想法做。关键在于文档中的这一行:

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

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

因此,当您的算法到达 dob 节点并调用 $value->hasChildren() 时,它会真正检查项目 $value->current() 是否有任何子节点。因此,在您的示例中,它检查节点 /tag/dob/dd 是否有任何子节点,但它没有。

于 2013-02-06T16:14:54.537 回答