Поиск всех дочерних элементов в xml с помощью php

#php #xml

#php #xml

Вопрос:

Я хотел бы получить все дочерние элементы и дочерние элементы дочерних элементов (в основном все) внутри узла, не зная, насколько глубоко расположены вложенные узлы. Я могу использовать циклы, я полагаю, но я не был уверен, существует ли встроенная функция, которая извлекает все эти данные для меня одним махом.

Спасибо, что я использую simplexml_load_file() в php

Ответ №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;
}
  

будет вывод (демо)

 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
  

Ответ №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();
        }

}

?>
  

Ответ №3:

если вы хотите придерживаться 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'];
        }
    }
}