Boucle sur un fichier XML (SAX)

Résolu
lefreeman63 Messages postés 136 Date d'inscription   Statut Membre Dernière intervention   -  
[Dal] Messages postés 6205 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:

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
A voir également:

1 réponse

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut lefreeman63,

Le
if
utilise la fonction Perl
ref
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
1
lefreeman63 Messages postés 136 Date d'inscription   Statut Membre Dernière intervention  
 
un grand merci pour ta réponse.
Cela m'aide bien.

J'aurais une autre question du coup, et j'espère être assez clair.

Mais à quoi je vais voir que mon fichier XML va être une référence ou non à un tableau?

Merci d'avance pour ta réponse.
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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
0
lefreeman63 Messages postés 136 Date d'inscription   Statut Membre Dernière intervention  
 
Bon et ben un grand merci, du coup je comprend mieux mon soucis maintenant.

Merci beaucoup et bonne continuation à toi
0
lefreeman63 Messages postés 136 Date d'inscription   Statut Membre Dernière intervention  
 
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 le
ELSE.

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 :-)
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
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
0