Boucle sur un fichier XML (SAX)

Résolu/Fermé
lefreeman63 Messages postés 136 Date d'inscription mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016 - Modifié par lefreeman63 le 8/01/2014 à 09:37
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 9 janv. 2014 à 11:28
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 8/01/2014 à 10:42
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
Modifié par lefreeman63 le 8/01/2014 à 11:40
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 8/01/2014 à 12:25
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
8 janv. 2014 à 14:11
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 mercredi 20 avril 2011 Statut Membre Dernière intervention 11 février 2016
8 janv. 2014 à 14:46
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 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
8 janv. 2014 à 15:07
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