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) :
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
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>
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 root.Audio.DuplexMode.enum.entry = get root.Audio.ForwardOnPost.bool = array(yes, no) root.Audio.MaxListeners.int = array(min=>0, max=>20) etc...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
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 ) ) ) )
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
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 ) ; } }
J'ai dû louper un chapitre sur la récursivité ou bien je n'utilise pas la bonne méthode.. ?
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
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 ?








Répondre avec citation
Partager