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