使用php搜索xml中的所有子项

时间:2011-10-19 12:04:48

标签: php xml

我想让一个节点内的所有孩子和孩子(基本上所有的东西)都知道,而不知道嵌套节点有多深。我可以使用循环,但我不确定是否有一个本机函数可以一次性为我检索所有这些数据。

谢谢我在php中使用simplexml_load_file()

3 个答案:

答案 0 :(得分:1)

使用SimpleXmlIterator

可轻松实现这一目标
  

提供SimpleXMLElement对象的所有节点的递归迭代。

实施例

$xml = <<< XML
<node id="l-1">
    <node id="l-1-1">
        <node id="l-1-1-1">
            <node id="l-1-1-1-1"/>
        </node>
    </node>
    <node id="l-1-2">
        <node id="l-1-2-1">
            <node id="l-1-2-1-1"/>
            <node id="l-1-2-1-2"/>
        </node>
    </node>
</node>
XML;

$xmlIterator = new RecursiveIteratorIterator(
    new SimpleXMLIterator($xml),
    RecursiveIteratorIterator::SELF_FIRST
);

foreach ($xmlIterator as $nodeName => $node) {
    echo $nodeName, $node['id'], PHP_EOL;
}

将输出(demo

nodel-1-1
nodel-1-1-1
nodel-1-1-1-1
nodel-1-2
nodel-1-2-1
nodel-1-2-1-1
nodel-1-2-1-2

答案 1 :(得分:0)

如果你想坚持使用SimpleXML,正如你在the documentation中看到的那样,只有get direct children的方法。要获得嵌套的子代,你必须遍历这些并查找它们 - 就像你在文档中看到的Exampe #1一样:

$xml = new SimpleXMLElement(
'<person>
 <child role="son">
  <child role="daughter"/>
 </child>
 <child role="daughter">
  <child role="son">
   <child role="son"/>
  </child>
 </child>
</person>');

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

    foreach ($second_gen->children() as $third_gen) {
        echo ' who begot a ' . $third_gen['role'] . ';';

        foreach ($third_gen->children() as $fourth_gen) {
            echo ' and that ' . $third_gen['role'] .
                ' begot a ' . $fourth_gen['role'];
        }
    }
}

答案 2 :(得分:0)

尝试使用,您可能需要编辑

<?
$xmlfile="test.xml";
$reader = new XMLReader();
$reader->open($xmlfile); 

while ($reader->read()) { 

        if($reader->nodeType == XMLReader::ELEMENT){
            echo "<br><b>Element:</b>".$reader->name;
        }
        if($reader->nodeType == XMLReader::TEXT){
            echo "   <b>Text:</b>".$reader->value;
        }
        if($reader->hasAttributes){
            $reader->moveToNextAttribute();
            echo "   <b>Attribute:</b>".$reader->name." <b>value:</b>".$reader->value;
            $reader->read();
            $reader->read();
        }

}

?>