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

Bibliothèques et frameworks PHP Discussion :

[SimpleXML] Analyser recursivement


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Par défaut [SimpleXML] Analyser recursivement
    Bonjour,

    A partir d'un objet XML (obtenu via une requete cURL contenue dans une classe), j'ai besoin de reconstituer une liste à partir de différents noeuds enfants.

    Je ne connais pas A PRIORI la longueur ni le nombre de parametres à récupérer. Seulement le format récursif du fichier xml et donc de l'objet récupéré.

    Le fichier XML d'origine (partiel) :
    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
    28
    29
    30
    31
     
    <model>AXIS 207MW</model>
    <firmwareVersion>4.40.1</firmwareVersion>
     
     <group name="root">
     
      <group name="Audio">
     
       <parameter name="DuplexMode" value="get" securityLevel="7714" niceName="Duplex mode">
     
        <type readonly="true">
     
         <enum>
          <entry value="get" niceValue="Simplex - Network Camera microphone only"/>
         </enum>
        </type>
      </parameter>
     
    <parameter name="ForwardOnPost" value="no" securityLevel="7744" niceName="Forward on post">
     
     <type readonly="true">
      <bool true="yes" false="no"/>
     </type>
     </parameter>
     
    <parameter name="MaxListeners" value="10" securityLevel="7714" niceName="Max listeners">
     
     <type>
      <int min="0" max="20" maxlen="2"/>
     </type>
    </parameter>
    La liste telle que je voudrais la créer, qui est la liste des paramètres et des valeurs qu'ils peuvent accepter, toutes ces infos figurant dans l'objet XML:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    root.Audio.DuplexMode.enum.entry = get
    root.Audio.ForwardOnPost.bool = array(yes, no)
    root.Audio.MaxListeners.int = array(min=>0, max=>20)
    etc...
    L'objet SimpleXML (partiel, correspondant à l'extrait du fichier XML présenté plus haut) :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [version] => 1.0
            )
     
        [model] => AXIS 207MW
        [firmwareVersion] => 4.40.1
        [group] => SimpleXMLElement Object
            (
                [@attributes] => Array
                    (
                        [name] => root
                    )
     
                [group] => Array
                    (
                        [0] => SimpleXMLElement Object
                            (
                                [@attributes] => Array
                                    (
                                        [name] => Audio
                                    )
     
                                [parameter] => Array
                                    (
                                        [0] => SimpleXMLElement Object
                                            (
                                                [@attributes] => Array
                                                    (
                                                        [name] => DuplexMode
                                                        [value] => get
                                                        [securityLevel] => 7714
                                                        [niceName] => Duplex mode
                                                    )
     
                                                [type] => SimpleXMLElement Object
                                                    (
                                                        [@attributes] => Array
                                                            (
                                                                [readonly] => true
                                                            )
     
                                                        [enum] => SimpleXMLElement Object
                                                            (
                                                                [entry] => SimpleXMLElement Object
                                                                    (
                                                                        [@attributes] => Array
                                                                            (
                                                                                [value] => get
                                                                                [niceValue] => Simplex - Network Camera microphone only
                                                                            )
     
                                                                    )
     
                                                            )
     
                                                    )
     
                                            )
     
                                        [1] => SimpleXMLElement Object
                                            (
                                                [@attributes] => Array
                                                    (
                                                        [name] => ForwardOnPost
                                                        [value] => no
                                                        [securityLevel] => 7744
                                                        [niceName] => Forward on post
                                                    )
     
                                                [type] => SimpleXMLElement Object
                                                    (
                                                        [@attributes] => Array
                                                            (
                                                                [readonly] => true
                                                            )
     
                                                        [bool] => SimpleXMLElement Object
                                                            (
                                                                [@attributes] => Array
                                                                    (
                                                                        [true] => yes
                                                                        [false] => no
                                                                    )
     
                                                            )
     
                                                    )
     
                                            )
     
                                        [2] => SimpleXMLElement Object
                                            (
                                                [@attributes] => Array
                                                    (
                                                        [name] => MaxListeners
                                                        [value] => 10
                                                        [securityLevel] => 7714
                                                        [niceName] => Max listeners
                                                    )
     
                                                [type] => SimpleXMLElement Object
                                                    (
                                                        [int] => SimpleXMLElement Object
                                                            (
                                                                [@attributes] => Array
                                                                    (
                                                                        [min] => 0
                                                                        [max] => 20
                                                                        [maxlen] => 2
                                                                    )
     
                                                            )
     
                                                    )
     
                                            )
    Et enfin, le code de lecture récursive de l'objet SimpleXML ($data->tmp) retourné par ma classe (en procédural pour les tests) :

    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
    28
    29
    parseXML($data->tmp, 0, '');
     
    function parseXML($oXML, $depth=0, $memo_param ) {
     
    	//$memo_param='';
    	echo '<br/> ---- <br/>';
     
    	foreach($oXML as $name => $elem) {
     
    			$children	= $elem->children();
    			$attributs	= $elem->attributes();
     
    			if(trim($attributs) != "") {
    				$balise	= $elem->getName();
    				echo '|'.str_repeat('-',$depth). '>'. $balise . ' ['.$nom.'] = '. $value . "<br/>" ;
    				if ($balise == 'group' || $balise == 'parameter' ) {
    					$memo_param .= $nom . '.' ;
    				}
    				else {
    					$memo_param = '' ;
    				}
    				echo "param=> $memo_param<br/><br/>";
    			}
     
    			// appel recursif  
    			parseXML($children, $depth + 1 , $memo_param ) ;
     
    	}
    }
    Sauf que je n'arrive pas à construire la liste évoquée plus haut. Le code tel que ci-dessus me sort les paramètres suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    root.Audio.DuplexMode.
    root.Audio.DuplexMode.ForwardOnPost
    root.Audio.DuplexMode.ForwardOnPost.MaxListeners
    J'ai dû louper un chapitre sur la récursivité ou bien je n'utilise pas la bonne méthode.. ?

    Est-ce que dans ce cas, la méthode DOM serait plus appropriée .. ?
    (à vrai dire, j'ai essayé sans succès)


    Quelqu'un aurait-il une suggestion avisée svp ?

  2. #2
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    je pense que tu devrais faire un test :
    - si $balise == 'group', appeler la fonction récursivement sur tous les enfants
    - si $balise == 'parameter', là tu fais la construction des paramètres sans appeler la fonction


    P.S. : voilà un début :

    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
    parseXML($xml->tmp);
     
    function parseXML($oXML, $depth = 0, $memo_param = '')
    {
        foreach ($oXML->children() as $name => $elem) {
            switch ($name) {
                case 'group' : 
                    parseXML($elem, $depth + 1, "$memo_param{$elem['name']}.");
                    break;
     
                case 'parameter' : 
                    echo "$memo_param{$elem['name']} = {$elem['value']}<br/>";
                    break;
            }
        }
    }
    chez moi ça donne ça :
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    root.Audio.DuplexMode = get
    root.Audio.ForwardOnPost = no
    root.Audio.MaxListeners = 10

  3. #3
    Membre chevronné
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Par défaut [RESOLU]
    Excellent, super merci.

    ça fonctionne bien aussi sur l'intégralité de l'objet.

    Je te suis très reconnaissant, j'avais cherché tt le WE sans succès et je commençais à vouloir partir sur une solution compliquée en DOM.. !

    Après je vais me débrouiller pour récupérer les enfants selon le pattern du XML.

    Merci encore.

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

Discussions similaires

  1. [SimpleXML] Analyser un très gros fichier XML
    Par Paulux1 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 20/02/2008, 03h53
  2. [SimpleXML] Analyser un fichier XML
    Par gannher dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 12/02/2008, 13h27
  3. [SimpleXML] Analyse de Google Calendar
    Par regis1_1 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 09/02/2008, 16h25
  4. [SimpleXML] Analyser un fichier XML avec PHP
    Par Someone86 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 10/08/2007, 10h43
  5. [SimpleXML] Analyse XML issu d'EXCEL
    Par a028762 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 12/05/2007, 22h35

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