IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

parseurs XML avec du perl


Sujet :

Modules Perl

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 34
    Points : 24
    Points
    24
    Par défaut parseurs XML avec du perl
    Re-bonjour à tous et à toutes,

    Je reviens vers vous car je me heurte à un problème concernant l'utilisation des parseurs pour lire un XML en Perl.
    Je me suis inspiré (pour ne pas dire autre chose) du tuto réalisé par Djibril et Nicolas.
    Voici mon problème j'ai un fichier XML que je souhaite décortiquer avec du perl afin de récupérer des valeurs...

    Voici le XML vue avec Dumper


    Code xml : 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
    17
     $VAR1 = {
              'queues' => {
                          'queue' => {
                                     'feed' => {
                                               'atom' => 'valeur1',
                                               'rss' => 'valeur2'
                                             },
                                     'stats' => {
                                                'consumerCount' => 'nombre1',
                                                'dequeueCount' => 'nombre2',
                                                'enqueueCount' => 'nombre3',
                                                'size' => '0'
                                              },
                                     'name' => 'INCOMING_1'
                                   }
                        }
            };

    Voici le code perl

    Code perl : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    =#!/usr/bin/perl -w
     
    use strict;
    use Switch;
    use warnings;
    use LWP::Simple;
     
    use XML::Simple;
    my $parser = XML::Simple->new( KeepRoot => 1 );
     
    my $file_in="filein.xml";
     
     
    getstore("@ de l'xml",$file_in);
    my (%args, %queues);
    my %error=('ok'=>0,'warning'=>1,'critical'=>2,'unknown'=>3);
    my ($warninglevel, $criticallevel, $tmp, $evalcount, $switch, $queueselect, $queuevalue);
    my $key = my $value = my $i = my $k = 0;
    my $exitcode = "unknown";
     
     
    # Creation du fichier resultat
    my $FichierResulat = 'resultat.txt';
    open( my $FhResultat, '>', $FichierResulat )
      or die("Impossible d'ouvrir le fichier $FichierResulat\n$!");
    my $doc = $parser->XMLin($file_in);
     
     
    use Data::Dumper;
    print Dumper $doc;
     
     
     
    #tout le fichier XML est dans $doc sous forme d'arbre
     
    foreach my $valeur ( @{ $doc->{queues}->{queue}} ) {
     print {$FhResultat} 'Queue valeur : ';
     print {$FhResultat} $valeur->{name};
     print {$FhResultat} "\t";
     
     print {$FhResultat} 'Size : ';
     print {$FhResultat} $valeur->{stats}->{size};
     
     print {$FhResultat} 'DequeueCount : ';
     print {$FhResultat} $valeur->{stats}->{dequeuecount};
     
    }
     
     
    # Fermeture du fichier
    close($FhResultat);


    Lorsque je lance le script je me retrouve avec un jolie "Not an ARRAY reference at monscript.pl line 42."

    Impossible de trouver le pk du comment...
    Si vous avez une piste messieurs (dames) je suis preneur..

    En vous remerciant.
    Christophe

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Bonsoir,

    L'erreur est normale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $doc->{queues}->{queue}
    ne retourne pas une référence de tableaux, mais une référence de hash comme tu le vois dans ta sortie de Dumper.

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 34
    Points : 24
    Points
    24
    Par défaut
    Merci Djibirl..

    J'ai fais quelques modifs sur mon script..

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    print "Enqueue: $doc->{queues}->{queue}->{stats}->{enqueue}  ";
     36 print "Consumer: $doc->{queues}->{queue}->{stats}->{consumer}  ";
     37 print "Name: $doc->{queues}->{queue}->{name}\n";
     38
     39 foreach my $appli ( @{$doc->{'queues'}{'queue'}} ) 
     40 {
     41 print "name : $appli->{name}";
     42 print "stats : $appli->{stats}";
     43 print "consumer : $appli->{consumer}";
     44 }
     45
     47 close($FhResultat);


    Cela m'affiche les valeurs que je veux à présent

    Enqueue: 125 Consumer: 0 Name: INCOMING_1
    Not an ARRAY reference at ./check_activemq_watch_CBP.pl line 39.

    Mais toujours le not an array... Je fouille encore et toujours... je me suis inspiré du tuto http://perl.developpez.com/faq/perl/...des-references
    Je vais tenter de l'adapter pour y mettre des seuils par la suite (nagios)..

    Merci et je vous tiens au courant !

    Chris

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Au lieu d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach my $valeur ( @{ $doc->{queues}->{queue}} ) {
    tu dois écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $valeur ( keys %{ $doc->{queues}->{queue}} ) {
        print "$valeur\n";
    }
    etc.

    Comme je l'ai dit dans mon tutoriel, ce module est simple si on travail avec des fichiers XML basiques. Dès que cela commence à trop s'imbriquer, il faut maitriser les références et cela devient ardu. Je recommande d'utiliser XML::Twig pour le parsing de tes fichiers. J'ai mis plusieurs exemples dans ce forum de gauche à droite.

Discussions similaires

  1. Parseur xml en perl
    Par vascoambrgifromanger dans le forum Modules
    Réponses: 4
    Dernier message: 04/06/2009, 10h20
  2. Réponses: 4
    Dernier message: 15/11/2007, 10h44
  3. Manipulation d'un fichier XML avec Perl
    Par brahak dans le forum Modules
    Réponses: 3
    Dernier message: 01/05/2006, 22h36
  4. [XML] [EXPAT] Problème avec Parseur XML
    Par tubeless dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/02/2006, 09h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo