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 />";
  }
Author: tdjfdjdj, 2011-07-07

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
            }
        }
    }
?>
 2
Author: andyb, 2011-07-07 15:32:21

Проверьте это

$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 />';
    }
  }
}
 0
Author: DixonMD, 2013-05-21 08:45:06