用php搜索xml中的所有子节点


Search for all children in xml with php

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

谢谢,我在php中使用simplexml_load_file()

这是很容易实现的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

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

<?
$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();
        }
}
?>

如果您想坚持使用SimpleXML,就像您在文档中看到的那样,只有一个方法可以获得直接子节点。要得到嵌套的子,你必须循环这些并寻找它们-就像在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'];
        }
    }
}