SimpleXMLIterator不显示孩子

时间:2014-10-30 02:54:43

标签: php xml simplexml

我遇到了SimpleXMLIterator的问题,并通过xml结构降序。我将其分解为这篇帖子最简单的形式:

<?php

$string = <<<'XML'
<test>
    <group>
        <script>
        </script>
    </group>
</test>
XML;

$iterator = new SimpleXMLIterator($string);

for($iterator->rewind() ; $iterator->valid() ; $iterator->next()){
    echo $iterator->key() . "<br>";
}

我希望上面的代码会输出:

group
script

但是当我运行它时,它只输出group

当我移动xml以便组和脚本是兄弟姐妹时:

<?php

$string = <<<'XML'
<test>
    <group>
    </group>
    <script>
    </script>
</test>
XML;

$iterator = new SimpleXMLIterator($string);

for($iterator->rewind() ; $iterator->valid() ; $iterator->next()){
    echo $iterator->key();
}

我让小组和剧本都得到了回应。

我一直在阅读有关迭代器的文档,但我没有看到任何说它不会传给孩子们的东西。我误解了这个工具吗?

1 个答案:

答案 0 :(得分:1)

具有两个节点的第二个xml在同一级别上。然而,第一个节点具有第一个节点,而第二个节点位于内部,因此不会遍历。所以你需要以递归的方式遍历它。

在这种情况下,您可以使用RecursiveIteratorIterator

$string = <<<'XML'
<test>
    <group>
        <script>
        </script>
    </group>
</test>
XML;


$xmliterator = new SimpleXMLIterator($string);
$iterator = new RecursiveIteratorIterator($xmliterator, RecursiveIteratorIterator::SELF_FIRST);
for($iterator->rewind() ; $iterator->valid() ; $iterator->next()){
    echo $iterator->key() . "<br>";
}