2010-01-24 4 views
4

J'ai une fonction qui simplexml utilise pour revenir au premier niveau des noeuds dans un fichier XML et écrire dans une liste non numérotée:PHP: Utilisation simplexml en boucle à tous les niveaux d'un fichier 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 J'utilise, qui a imbriqué nœuds:

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

maintenant, je commence à ajouter des nœuds enfants des noeuds que je suis en retour. Existe-t-il un moyen de parcourir tous les niveaux de nœuds enfants dans un fichier xml, même si je ne connais pas le nombre de niveaux et que je les ajoute à ma liste?

+0

Quelques exemples de XML s'il vous plaît. –

+0

Message mis à jour avec XML. –

Répondre

8

Donc, fondamentalement, ce que vous devez faire est une fonction qui prend chaque enfant <asset/> du noeud courant, construit le HTML vérifie alors si le noeud courant a <asset/> les enfants de son propre et maintient récursion plus profondément l'arbre.

Voici comment vous pouvez le faire:

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

D'ailleurs, je me attends à une fonction nommée « PRintX » pour en fait impression ou quelque chose d'écho, plutôt que de le retourner. Peut-être que vous devriez nommer ces fonctions "buildX"?

+0

C'est parfait! Fonctionne exactement comme je le voulais, et c'est propre et simple. Je vous remercie! –

1

vous devez utiliser une fonction récursive. Voici un exemple qui génère un tableau à partir de XML. C'est à partir des documents PHP - http://www.php.net/manual/en/ref.simplexml.php. Vous pouvez modifier cela pour afficher une liste.

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

Cela renverra un tableau avec tous les nœuds du document.

Questions connexes