IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Récursivité, affichage d'un contenu XML sous forme de liste


Sujet :

Langage PHP

  1. #1
    Membre du Club Avatar de Halex78
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 68
    Points
    68
    Par défaut Récursivité, affichage d'un contenu XML sous forme de liste
    Bonjour,

    j'essaie de faire ma fonction récursive pour afficher le contenu d'un document XML, ca fonctionne partiellement.

    Par exemple si j'ai le document XML suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <el name="Bases" ref="1" type="default">
    	<el name="Les Mécanismes" ref="5" type="default"></el>
    	<el name="Les Dés" ref="6" type="default"></el>
    	<el name="Les Fractions" ref="7" type="default"></el>
    	<el name="La Multiplication" ref="8" type="default"></el>
    </el>
    La fonction me retourne :
    • Bases
      • Les Mécanismes
      • Les Dés
      • Les Fractions
      • La Multiplication
    • Les Mécanismes
    • Les Dés
    • Les Fractions
    • La Multiplication


    Voici le code de ma fonction, je souhaite qu'elle retourne un contenu, et non qu'elle l'affiche directement via des echos.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    function ReturnArbreXML( $domNodeList )
    {
        $html = '<ul>';
        foreach( $domNodeList as $Node )
        {
            $html .= '<li>';
            If ( $Node->getAttribute( "type" ) == 'default' )
            {
                $class = 'clickable';
            }
            else
            {
                $class = 'nonclickable';
            }
            $html .= '<a href="#" class="' . $class . '">' . $Node->getAttribute( "name" ) . '<span style="display:none;">' . $Node->getAttribute( "ref" ) . '</span></a>';
     
            If ( $Node->hasChildNodes() )
            {
            	$newDomNodeList = $Node->getElementsByTagName("el");
                $html .= ReturnArbreXML( $newDomNodeList );
            }
            $html .= '</li>';
        }
        $html .= '</ul>';
        return $html;
    }
    Merci de votre aide !

  2. #2
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    Je pense que tu te trompes dans le paramètre que tu passes à la fonction ReturnArbreXML au départ.

    J'imagine que tu passes ceci en paramètre au premier appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReturnArbreXML($doc->getElementsByTagName('el'));
    Ce qui a pour effet de passer à la fonction l'ensemble des noeuds "el". Alors que toi tu ne veux lister au départ que ceux de premier niveau.

    Alors que tu devrais simplement passer les enfants du document element :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ReturnArbreXML($doc->documentElement->childNodes);

  3. #3
    Membre du Club Avatar de Halex78
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 68
    Points
    68
    Par défaut
    merci, j'essayes.

    getElementsByTagName retourne TOUS les éléments ? Pas seulement ceux qui sont enfants ?

  4. #4
    Membre du Club Avatar de Halex78
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 68
    Points
    68
    Par défaut
    alors, le problème, c'est que documentElement n'a l'air de fonctionner que pour l'élément racine, or l'argument passé dans la fonction est une liste de nodes provenant d'une requête xpath

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $doc = new DomDocument();
    $doc->load('fichier.xml');
    $xpath = new DomXpath($doc);
    $domNodeList = $xpath->query('//edition[@value=\'3.5\']/el');
    J'ai donc les premiers noeuds sans problèmes, mais les suivants sont "problèmatiques" car toujours doublés voire triplés selon leur position dans la hiérarchie.

    En somme, il faut la fonction qui donne juste les éléments fils d'un noeud, chilsnodes avait l'air de convenir , mais il me retourne des "DOMText"

    EDIT :

    Finalement, j'ai ajouté un argument, et ca fonctionne ! J'ai passé l'instance "$xpath" générée à partir de l'objet initial $doc, du coup, ca marche très bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    function ReturnArbreXML( $domNode , $xpath )
    {
    	$domNodeList = $xpath->query('el',$domNode);
        $html = '<ul>';
        foreach( $domNodeList as $Node )
        {
                $html .= '<li>';
                If ( $Node->getAttribute( "type" ) == 'default' )
                {
                    $class = 'clickable';
                }
                else
                {
                    $class = 'nonclickable';
                }
                $html .= '<a class="' . $class . '">' . $Node->getAttribute( "name" ) . '<span style="display:none;">' . $Node->getAttribute( "ref" ) . '</span></a>';
     
                If ( $Node->hasChildNodes() )
                {
                    $html .= ReturnArbreXML( $Node ,$xpath );
                }
                $html .= '</li>';
        }
        $html .= '</ul>';
        return $html;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] affichage du contenu de BD MySQL sous forme de liste déroulante
    Par logiclogic dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 04/03/2013, 11h41
  2. [JDOM] Parser du xml sous forme de string avec JDOM
    Par Lord Yu dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 02/02/2010, 12h47
  3. récupérer des données XML sous forme de tableau
    Par ar vuzhugenn dans le forum ActionScript 1 & ActionScript 2
    Réponses: 8
    Dernier message: 22/04/2008, 21h21
  4. [XML] décrire un xml sous forme de graphe ?
    Par convexe dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 21/10/2007, 09h49
  5. XSL pour visualiser arbre XML sous forme de tableau en HTML
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 28/03/2003, 10h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo