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 ?