PHP простой XML, как читать несколько узлов с различными уровнями дочерних узлов - PullRequest
3 голосов
/ 07 июля 2011

У меня есть 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 />";
  }

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

Вот пример кода, который, я надеюсь, может указать вам правильное направление. По существу, это , идущий по 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
            }
        }
    }
?>
0 голосов
/ 21 мая 2013

отметьте это

$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 />';
    }
  }
}
...