php простой xml как читать несколько узлов с разными уровнями дочерних узлов
У меня есть xml-файл с разными именованными узлами и многоуровневыми дочерними узлами (которые различаются между каждым узлом). Как я должен получить доступ к данным? Потребуется ли для этого много вложенных циклов for?
Вот пример 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 />";
}
2 answers
Вот пример кода, который, я надеюсь, может указать вам правильное направление. По сути, это прогулка по 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 />';
}
}
}