#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'];
}
}
}