Boucle sur un fichier XML (SAX)
Résolu
lefreeman63
Messages postés
139
Statut
Membre
-
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6122 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai un léger soucis ^^.
Je suis en train de reprendre un script développer par quelqu'un d'autre et j'ai un très gros soucis a comprendre les tests qui sont fait dans la boucle IF.
Pourriez vous m'aidez svp
Voici le code:
Je ne comprend pas ce que vérifie le IF et le else
Merci d'avance de votre aide
J'ai un léger soucis ^^.
Je suis en train de reprendre un script développer par quelqu'un d'autre et j'ai un très gros soucis a comprendre les tests qui sont fait dans la boucle IF.
Pourriez vous m'aidez svp
Voici le code:
my $xmlfile = XMLin($xml_file ) or logAndDie "[ERROR] Can not read XML file $xml_file !\n";
if ( ref($xmlfile->{LIST_BURST}->{BURST}) ne 'ARRAY' )
{
my $Addr = $xmlfile->{LIST_BURST}->{BURST};
&all_burst($Addr);
}
else
{
foreach my $Addr ( @{ $xmlfile->{LIST_BURST}->{BURST} } )
{
&all_burst($Addr);
}
}
Je ne comprend pas ce que vérifie le IF et le else
Merci d'avance de votre aide
1 réponse
-
Salut lefreeman63,
Leif
utilise la fonction Perlref
pour tester si$xmlfile->{LIST_BURST}->{BURST}est une référence vers un tableau.
https://perldoc.perl.org/functions/ref
Si ce n'est pas une référence vers un tableau, la valeur de$xmlfile->{LIST_BURST}->{BURST}est rangée dans$Addr
, puis traitée par une fonction all_burst définie dans ton programme.
Si c'est une référence vers un tableau, le tableau est parcouru dans le else, et les valeurs successives sont mises par le foreach dans$Addr
, puis traitée par une fonction all_burst définie dans ton programme.
Dal-
-
Ton code utilise XMLin() du module XML::Simple.
Vois https://metacpan.org/pod/release/GRANTM/XML-Simple-2.20/lib/XML/Simple.pm
pour comprendre son fonctionnement.
Par définition,my $xmlfile = XMLin($xml_file);
va retourner une référence à une structure de données dans $xmlfile.
Ton code vérifie si dans cette structure de données BURST contenue dans LIST_BURST, contient une référence vers un tableau.
Si c'est le cas, c'est probablement parce que ton fichier XML contient quelque chose comme :
<xmlfile> <LIST_BURST> <BURST>10.0.0.101</BURST> <BURST>10.0.1.102</BURST> <BURST>10.0.1.103</BURST> </LIST_BURST> </xmlfile>
Si ce n'est pas une référence à un tableau, c'est certainement parce qu'il n'y a qu'une seule entrée "BURST" sous "LIST_BURST" dans ton fichier XML.
Dal -
-
lol je le comprend mieux mais je peux pas le résoudre... :-/
Effectivement dans mon fichier de test je n'ai qu'une seul balise <BURST> c'est pour cela que je passe dans la boucle IF et que mon fichier est rangée dans $Adrr.
Cependant, quand je lance la fonction $all_burst cette ligne la ne fonctionne pas :
print LOG "[INFO] ".localtime(time)." Filename : " . $F->{FILE_NAME} . "\n";
$F->{FILE_NAME} ne me ramène aucune information.
Alors que cela fonctionne si il y a plusieur balise <BURST> et je passe dans leELSE.
Sa me dépasse un peu beaucoup :-/
Toutes mes lignes de commande $F-> ..........
Ne récupère pas les informations dont j'ai besoin.
Désolé de encore te demander de l'aide :-) -
C'est difficile de te répondre sans avoir un jeu de données, et le code de all_burst pour savoir d'où sort ce $F->{FILE_NAME} et pourquoi il est vide.
Tu pourrais utiliser le module Data::Dumper pour inspecter le contenu de ce qui est passé à ta fonction dans un cas et dans l'autre et voir ce qui diffère et pourquoi.
Dal
-