У меня есть xml-файл с разными именованными узлами и многоуровневыми дочерними узлами (которые различаются между каждым узлом.) Как мне получить доступ к данным? Будет ли это требовать много вложенных циклов?
Вот пример кода xml:
<start_info> <info tabindex="1"> <infonumber>1</infonumber> <trees>green</trees> </info> </start_info> <people> <pe> <people_ages> <range number="1"> <age value="1">1</age> <age value="2">2</age> </range> </people_ages> </pe> </people>
Вот мой код:
$xml = simplexml_load_file("file.xml"); echo $xml->getName() . "start_info"; foreach($xml->children() as $child) { echo $child->getName() . ": " . $child . "<br />"; }
Вот пример кода, который, я надеюсь, может указать вам в правильном направлении. По сути, он идет по DOMDocument
повторяя имя и значения элемента. Обратите внимание, что пробелы между элементами значительны, поэтому для целей демонстрации XML уплотняется. Вы можете найти подобную загрузку проблемы из файла, поэтому, если вы не получаете ожидаемый результат, вам может понадобиться удалить узлы с пробелами.
Вы могли бы заменить //root/*
другим XPath, например //people
если вам нужны только элементы <people>
.
<?php $xml = <<<XML <root><start_info><info tabindex="1"><infonumber>1</infonumber><trees>green</trees></info></start_info> <people><pe><people_ages><range number="1"><age value="1">1</age><age value="2">2</age></range></people_ages></pe></people> </root> XML; $dom = new DOMDocument(); $dom->recover = true; $dom->loadXML($xml); $xpath = new DOMXPath($dom); $nodelist = $xpath->query('//root/*'); foreach ($nodelist as $node) { echo "\n$node->tagName"; getData($node); } function getData($node) { foreach ($node->childNodes as $child) { if ($child->nodeType == XML_ELEMENT_NODE) { echo ($child->tagName === '' ? '' : "\n").$child->tagName; } if ($child->nodeType == XML_TEXT_NODE) { echo '->'.$child->nodeValue; } if ($child->hasChildNodes()) { getData($child); // recursive call } } } ?>
Проверь это
$xml_file = 'file.xml'; $xmlobj = simplexml_load_file($xml_file); echo $xmlobj->getName() . 'start_info<br />'; foreach($xmlobj->children() as $childs) { echo $childs->getName(). ': '. '<br />'; if($childs->count()>1) { foreach($childs as $child) { echo $child->getName(). ': '. $child. '<br />'; } } }