Bonjour,
Je débute en perl et je trouve les possibilités offertes assez fantastiques.
Mon soucis est le suivant : je souhaite parser un fichier xml via XML::Simple, mais, j'ai dans mon fichier .xml des balises imbriquées (je veux dire des balises ayant les mêmes noms), comme par exemple:
...
<PACKAGE>
<NAME> PAPA </NAME><PACKAGE><NAME> ENFANT </NAME></PACKAGE></PACKAGE>
<PACKAGE>
<NAME> MAMAN </NAME><PACKAGE><NAME> BEBE </NAME></PACKAGE></PACKAGE>
...
Mon objectif est de récupérer tous les noms (NAME) des PACKAGE, sachant que:
- je ne peux pas modifier mon fichier.xml
- j'aimerai garder XML::Simple pour le parsing (car je sais faire des choses avec dont je ne suis pas peu fier - mais je me contente de peu ).
Le problème c'est que les noms à récupérer peuvent être à "X" niveaux dans mon fichier (je n'en ai mis que deux dans l'exemple) !!!
J'ai écris cela :
Ca fonctionne pour tous les noms des packages des 2 premiers niveaux mais "en dur". Je ne souhaite pas tout faire ainsi...
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 sub ma_lecture_data_xml { $nb_pack_Level_1 = $#{$config->{MODEL}->[0]->{PACKAGE}}; #nb de package 1er niveau $nb_pack_Level_2 = $#{$config->{MODEL}->[0]->{PACKAGE}->[0]->{PACKAGE}}; #nb de package 2ème niveau for ($j=0; $j<= $nb_pack_Level_1; $j=$j+1) { $package_id = $config->{MODEL}->[0]->{PACKAGE}->[$j]->{NAME}->[0]; print $package_id."\n" for ($k=0; $k<= $nb_pack_Level_2; $k=$k+1) { $package_id = $config->{MODEL}->[0]->{PACKAGE}->[$j]->{PACKAGE}->[$k]->{NAME}->[0]; print $package_id."\n" } } }
1) Comment faire pour trouver "automatiquement" les "x" niveaux s'il y a "x" niveaux d'imbrication ?
2) la chaine $config->{MODEL}->[0]->{PACKAGE}->[$j]->{PACKAGE}->[$k]->{NAME}->[0]; est-elle découpable en variables intermédiaires (genre je rajoute un étage si besoin comme on le fait avec l'opérateur "." pour concaténer des chaines de caractères) ? Si oui comment ?
3) l'utilisation du nombre d'éléments me permet même de traiter les cas où il n'y a pas de sous-niveau car "-1" est alors renvoyé et je ne rentre pas dans la boucle for correspondante. Je ne sais pas si c'est très élégant mais je n'ai pas trouvé mieux...
Merci pour vos éclairages et bravo pour tous les tutos ici et là.
Partager