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   -
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

1 réponse

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    1. lefreeman63 Messages postés 139 Statut Membre
       
      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
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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
    3. lefreeman63 Messages postés 139 Statut Membre
       
      Bon et ben un grand merci, du coup je comprend mieux mon soucis maintenant.

      Merci beaucoup et bonne continuation à toi
      0
    4. lefreeman63 Messages postés 139 Statut Membre
       
      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
    5. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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