我正在使用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>
由于
答案 0 :(得分:3)
hasChildren方法不适合您,因为它没有按照您的想法进行操作。关键在于文档中的这一行:
此方法检查当前的SimpleXMLIterator元素是否具有子元素。
当它表示“current”时,它表示 current()函数返回的实际SimpleXMLElement,就好像您正在使用foreach进行迭代一样。请记住,SimpleXMLIterator被设计为“迭代器”
因此,当您的算法到达dob节点并且您调用$ value-&gt; hasChildren()时,它会真正检查项$ value-&gt; current()是否有子节点。因此,在您的示例中,它检查节点/标记/ dob / dd是否有任何子节点,而不是。