PHP: Использование SimpleXML для прохождения всех уровней XML -файла

StackOverflow https://stackoverflow.com/questions/2129241

  •  22-09-2019
  •  | 
  •  

Вопрос

У меня есть функция, которая использует simplexml для возврата первого уровня узлов в файле XML и записать ее в неупорядоченный список:

function printAssetMap() {
    $xml = simplexml_load_file(X_ASSETS);
    $assets = $xml->asset;
    $html = '<ul>'."\n";
    foreach ($assets as $asset) {
        $html .= '<li id="asset'.$asset->asset_assetid.'"><ins>&nbsp;</ins><a href="#">'.$asset->asset_name.' ['.$asset->asset_assetid.']</a></li>'."\n";
    }//end foreach
    $html .= '</ul>'."\n";
    return $html;
}// printAssetMap()

Xml я использую, у которых есть вложенные узлы:

<?xml version="1.0"?>
<assets>
  <asset>
    <asset_name>Home</asset_name>
    <asset_url>/home</asset_url>
    <asset_assetid>1</asset_assetid>
  </asset>
  <asset>
    <asset_name>Projects</asset_name>
    <asset_url>/projects</asset_url>
    <asset_assetid>2</asset_assetid>
    <asset>
      <asset_name>Portfolio</asset_name>
      <asset_url>/projects/portfolio</asset_url>
      <asset_assetid>3</asset_assetid>
    </asset>
    <asset>
      <asset_name>Current Jobs</asset_name>
      <asset_url>/projects/current-jobs</asset_url>
      <asset_assetid>4</asset_assetid>
    </asset>
  </asset>
</assets>

Теперь я начинаю добавлять детские узлы узлов, которые я сейчас возвращаю. Есть ли способ пройти через все уровни дочерних узлов в файле XML, даже если я не знаю, сколько их уровней, и добавить их в мой список?

Это было полезно?

Решение

Так что в основном вам нужно сделать функцию, которая принимает каждую <asset/> Ребенок текущего узла, строит HTML, затем проверяет, есть ли текущий узел <asset/> дети собственных и продолжают повторять глубже по дереву.

Вот как вы можете это сделать:

function printAssetMap()
{
    return printAssets(simplexml_load_file(X_ASSETS));
}

function printAssets(SimpleXMLElement $parent)
{
    $html = "<ul>\n";
    foreach ($parent->asset as $asset)
    {
        $html .= printAsset($asset);
    }
    $html .= "</ul>\n";

    return $html;
}

function printAsset(SimpleXMLElement $asset)
{
    $html = '<li id="asset'.$asset->asset_assetid.'"><ins>&nbsp;</ins><a href="#">'.$asset->asset_name.' ['.$asset->asset_assetid.']</a>';

    if (isset($asset->asset))
    {
        // has <asset/> children
        $html .= printAssets($asset);
    }

    $html .= "</li>\n";

    return $html;
}

Кстати, я ожидаю, что функция под названием «printx» на самом деле Распечатать Или что -то повторить, а не вернуть его. Возможно, вам следует назвать эти функции "Buildx"?

Другие советы

Вам нужно использовать рекурсивную функцию. Вот пример, который выводит массив из XML. Это от документов PHP - http://www.php.net/manual/en/ref.simplexml.php. Анкет Вы можете изменить это, чтобы вывести список.

<?php 
function XMLToArray($xml) 
{ 
  if ($xml instanceof SimpleXMLElement) { 
    $children = $xml->children(); 
    $return = null; 
  } 

  foreach ($children as $element => $value) { 
    if ($value instanceof SimpleXMLElement) { 
      $values = (array)$value->children(); 

      if (count($values) > 0) { 
        $return[$element] = XMLToArray($value); 
      } else { 
        if (!isset($return[$element])) { 
          $return[$element] = (string)$value; 
        } else { 
          if (!is_array($return[$element])) { 
            $return[$element] = array($return[$element], (string)$value); 
          } else { 
            $return[$element][] = (string)$value; 
          } 
        } 
      } 
    } 
  } 

  if (is_array($return)) { 
    return $return; 
  } else { 
    return $false; 
  } 
} 
?>
<?php
function all_nodes($xml){
    $all=array();
    function add($node){
        array_push($all,$node);
        foreach($node as $child){
            add($child);
        }
    }
    add($xml->documentElement);
    return $all;
}
?>

Это вернет массив со всеми узлами в документе.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top