PHP: Using simplexml to loop through all levels of an XML file

后端 未结 3 532
野的像风
野的像风 2021-01-03 05:16

I have a function which uses simplexml to return the first level of nodes in an XML file and write it into an unordered list:

function printAssetMap() {
             


        
相关标签:
3条回答
  • 2021-01-03 05:40
    <?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;
    }
    ?>
    

    This will return an array with all nodes in the document.

    0 讨论(0)
  • 2021-01-03 05:48

    you need to use a recursive function. here is an example that outputs an array from XML. It is from the PHP docs - http://www.php.net/manual/en/ref.simplexml.php. You can amend this to output a list.

    <?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; 
      } 
    } 
    ?>
    
    0 讨论(0)
  • 2021-01-03 06:00

    So basically what you need to do is a function that takes each <asset/> child of current node, builds the HTML then checks if the current node has <asset/> children of its own and keeps recursing deeper down the tree.

    Here's how you can do it:

    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;
    }
    

    By the way, I would expect a function named "printX" to actually print or echo something, rather than return it. Perhaps you should name those functions "buildX" ?

    0 讨论(0)
提交回复
热议问题