Frage

Ich habe eine Funktion, die Simplexml verwendet, um die erste Stufe der Knoten in einer XML -Datei zurückzugeben und sie in eine nicht ordnungsgemäße Liste zu schreiben:

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 Ich benutze, das hat verschachtelte Knoten:

<?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>

Jetzt fange ich an, Kinderknoten der Knoten hinzuzufügen, die ich derzeit zurückkomme. Gibt es eine Möglichkeit, alle Ebenen von untergeordneten Knoten in einer XML -Datei zu durchlaufen, auch wenn ich nicht weiß, wie viele Ebenen es gibt, und diese meiner Liste hinzufügen?

War es hilfreich?

Lösung

Im Grunde nehmen Sie also eine Funktion, die jeweils übernimmt <asset/> Kind des aktuellen Knotens, erstellt die HTML und prüft dann, ob der aktuelle Knoten hat <asset/> Kinder eigene Kinder und regen immer tiefer den Baum.

So können Sie es tun:

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

Übrigens würde ich eine Funktion namens "printx" erwarten, tatsächlich drucken Oder etwas wiederholen, anstatt es zurückzugeben. Vielleicht sollten Sie diese Funktionen "Buildx" nennen?

Andere Tipps

Sie müssen eine rekursive Funktion verwenden. Hier ist ein Beispiel, das ein Array von XML ausgibt. Es ist aus den PHP -Dokumenten - http://www.php.net/manual/en/ref.simplexml.php. Sie können dies ändern, um eine Liste auszugeben.

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

Dadurch wird ein Array mit allen Knoten im Dokument zurückgegeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top