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

Langage Perl Discussion :

Analyse de fichier XML


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Par défaut Analyse de fichier XML
    BOnjour a tous,
    Je suis en train de creer un script en perl qui devrai me permettre de recuperer des données dans un XML.
    Pour cela, j'ai lu le tuto suivant:
    http://djibril.developpez.com/tutoriels/perl/perl-xml/

    Et je me suis servi de l'exemple donné pour essayer de creer mon code.

    J'arrive a faire la moitié de mon travail.
    Je parviens bien a récupérer des données dans une partie de mon XML (les JOBS) mais pas dans l'autre (la SCHED_GROUP).
    Mon but étant de récupérer les valeurs TABLE_NAME dans SCHED_GROUP et APPLICATION dans JOBS.

    Voici mon XML de départ:
    Code : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    <?xml version='1.0' encoding='ISO-8859-1' ?>
    <!DOCTYPE DEFTABLE SYSTEM "deftable.dtd">
    <DEFTABLE >
     <SCHED_GROUP
      OWNER="controlm"
      TABLE_NAME="P_ACA_ARGGREG_DODBIS"
      TABLE_USERDAILY="ACA"
      USED_BY_CODE="0">
      <INCOND AND_OR="AND" NAME="CND_P_ACA_DENVOI-_CFTMEN_GGG_P_ACA_ARGGREG_DODBIS_GGG_OK" ODATE="ODAT" />
      <OUTCOND NAME="CND_P_ACA_DENVOI-_CFTMEN_GGG_P_ACA_ARGGREG_DODBIS_GGG_OK" ODATE="ODAT" SIGN="DEL"/>
      <OUTCOND NAME="CND_P_ACA_ARGGREG_DODBIS_GGG_P_ACA_DEXTRAC_DODBIS_GGG_OK" ODATE="ODAT" SIGN="ADD"/>
      <TAG
       APR="1"
       TAG_NAME="ALLD"
    />
      <TAG
       APR="1"
       TAG_NAME="P_ACA_ARGGREG_DODBIS"
    />
      <JOB
       APPLICATION="PA_CADCASA_ACA"
       APR="1"
       AUG="1"
       AUTHOR="ut12m4"
       TASKTYPE="Command"
       USE_INSTREAM_JCL="0"
    >
       <QUANTITATIVE NAME="PRQ_ACA" QUANT="1" />
       <OUTCOND NAME="CND_P_ACA_ARGGREG_DODBIS_010_P_ACA_ARGGREG_DODBIS_020_OK" ODATE="ODAT" SIGN="ADD" />
       <AUTOEDIT EXP="%%SREP=/data/csabiexp/log/" />
       <TAG_NAMES TAG_NAME="P_ACA_ARGGREG_DODBIS" />
       <QUANTITATIVE NAME="PRQ_SUBMIT" QUANT="1" />
       <ON
        CODE="NOTOK"
        STMT="*"
    >
        <DOSHOUT DEST="ECS" MESSAGE="[CTM_NTOK_%%COMPSTAT] [Réinitialisation Rapprochement DODGE/DODGEBIS]" URGENCY="V" />
       </ON>
       <ON
        CODE="*"
        STMT="*"
    >
        <DOSYSOUT OPTION="Copy" PAR="%%SREP.%%MEMNAME..log" />
       </ON>
      </JOB>
      <JOB
       APPLICATION="PA_CADCASA_ACA"
       APR="1"
       AUG="1"
       AUTHOR="ut12m4"
       TASKTYPE="Command"
       USE_INSTREAM_JCL="0"
    >
       <INCOND AND_OR="AND" NAME="CND_P_ACA_ARGGREG_DODBIS_010_P_ACA_ARGGREG_DODBIS_020_OK" ODATE="ODAT" />
       <QUANTITATIVE NAME="PRQ_ACA" QUANT="1" />
       <OUTCOND NAME="CND_P_ACA_ARGGREG_DODBIS_010_P_ACA_ARGGREG_DODBIS_020_OK" ODATE="ODAT" SIGN="DEL" />
       <AUTOEDIT EXP="%%SREP=/data/csabiexp/log/" />
       <TAG_NAMES TAG_NAME="P_ACA_ARGGREG_DODBIS" />
       <QUANTITATIVE NAME="PRQ_SUBMIT" QUANT="1" />
       <OUTCOND NAME="CND_P_ACA_ARGGREG_DODBIS_020_P_ACA_ARGGREG_DODBIS_030_OK" ODATE="ODAT" SIGN="ADD" />
       <ON
        CODE="NOTOK"
        STMT="*"
    >
        <DOSHOUT DEST="ECS" MESSAGE="[CTM_NTOK_%%COMPSTAT] [Réinitialisation status imputation quotidienne]" URGENCY="V" />
       </ON>
       <ON
        CODE="*"
        STMT="*"
    >
        <DOSYSOUT OPTION="Copy" PAR="%%SREP.%%MEMNAME..log" />
       </ON>
      </JOB>
      <JOB
       APPLICATION="PA_CADCASA_ACA"
       APR="1"
       AUG="1"
       AUTHOR="ut16lq"
       TASKTYPE="Command"
       USE_INSTREAM_JCL="0"
    >
       <INCOND AND_OR="AND" NAME="CND_P_ACA_ARGGREG_DODBIS_020_P_ACA_ARGGREG_DODBIS_030_OK" ODATE="ODAT" />
       <QUANTITATIVE NAME="PRQ_ACA" QUANT="1" />
       <OUTCOND NAME="CND_P_ACA_ARGGREG_DODBIS_020_P_ACA_ARGGREG_DODBIS_030_OK" ODATE="ODAT" SIGN="DEL" />
       <AUTOEDIT EXP="%%SREP=/data/csabiexp/log/" />
       <TAG_NAMES TAG_NAME="P_ACA_ARGGREG_DODBIS" />
       <QUANTITATIVE NAME="PRQ_SUBMIT" QUANT="1" />
       <ON
        CODE="NOTOK"
        STMT="*"
    >
        <DOSHOUT DEST="ECS" MESSAGE="[CTM_NTOK_%%COMPSTAT] Backup de la base DODGE]" URGENCY="V" />
       </ON>
       <ON
        CODE="*"
        STMT="*"
    >
        <DOSYSOUT OPTION="Copy" PAR="%%SREP.%%MEMNAME..log" />
       </ON>
      </JOB>
     </SCHED_GROUP>
     
    </DEFTABLE>
    J'ai enlevé des parties du XML pour l'alléger.

    Et voici mon code PERL:
    Code : 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
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    use XML::Simple;
     
    my $parser = XML::Simple->new( KeepRoot => 1 );
     
    # Creation du fichier resultat
    my $FichierResulat = 'résultat.txt';
    open( my $FhResultat, '>', $FichierResulat )
      or die("Impossible d'ouvrir le fichier $FichierResulat\n$!");
     
    my $doc = $parser->XMLin('PDC_FR_HPX_P_ACA_ARGGREG_DODBIS.xml');
     
    # Tout le fichier XML est dans $doc sous forme d'arbre
     
    foreach my $SCHED_GROUP ( %{ $doc->{DEFTABLE}->{SCHED_GROUP} } ) {
    	if ( $SCHED_GROUP eq "TABLE_NAME" ) {
    		print {$FhResultat} "ça marche a moitié";
    	}
     
    }
     
     
    #print {$FhResultat} my $SCHED_GROUP->{TABLE_NAME};
    foreach my $JOB ( @{ $doc->{DEFTABLE}->{SCHED_GROUP}->{JOB} } ) {
    	print {$FhResultat} "\n\nApplication : ";
    	print {$FhResultat} $JOB->{APPLICATION};
    	print {$FhResultat} "\nAuthor : ";
    	print {$FhResultat} $JOB->{AUTHOR};
    	print {$FhResultat} "\nChange userID : ";
    	print {$FhResultat} $JOB->{CHANGE_USERID};
    	print {$FhResultat} "\nCommande line : ";
    	print {$FhResultat} $JOB->{CMDLINE};
    	print {$FhResultat} "\nNode ID : ";
    	print {$FhResultat} $JOB->{NODEID};
    	print {$FhResultat} "\nOwner : ";
    	print {$FhResultat} $JOB->{OWNER};
     
    }
     
     
    # Fermeture du fichier
    close($FhResultat);
    Si vous pouviez m'indiquer une idée pour réussir a récupérer ce TABLE_NAME, je vous en serai reconnaissant.
    Merci,
    Cordialement,
    Benjamin

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Le fait que tu essayes d'utiliser les modules est une bonne chose. Comme tu le constates, l'utilisation de XML::Simple n'est pas si simple comme son nom l'indique si ton XML ne l'est pas (comme expliqué dans le tutoriel). Donc je te recommande d'utiliser XML::Twig qui pour moi le module le plus simple, cohérent, lisible et compréhensible à utiliser. Voici un code qui lit ton fichier XML en utilisant les 2 modules histoire que tu puisses voir pourquoi je recommande d'utiliser XML::Twig.

    Code : 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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    # Version 1 - utilisation de XML::Simple
    use XML::Simple;
     
    print "Version 1 - utilisation de XML::Simple\n\n";
    my $parser = XML::Simple->new( KeepRoot => 1 );
    my $xml = $parser->XMLin('PDC_FR_HPX_P_ACA_ARGGREG_DODBIS.xml');
     
    # Tout le fichier XML est dans $xml sous forme d'arbre
    foreach my $SCHED_GROUP ( %{ $xml->{DEFTABLE}{SCHED_GROUP} } ) {
     
      # Attribut TABLE_NAME de la balise  SCHED_GROUP
      if ( $SCHED_GROUP eq "TABLE_NAME" ) {
        print "TABLE_NAME : ", $xml->{DEFTABLE}{SCHED_GROUP}{$SCHED_GROUP}, "\n";
      }
     
      # C'est une référence de tableau
      elsif ( $SCHED_GROUP eq "JOB" ) {
        foreach my $job ( @{ $xml->{DEFTABLE}{SCHED_GROUP}{$SCHED_GROUP} } ) {
          print "APPLICATION : ", $job->{APPLICATION}, "\n";
        }
      }
    }
     
    # Version 2 - utilisation de XML::Twig
    use XML::Twig;
     
    print "Version 2 - utilisation de XML::Twig\n\n";
    my $twig = new XML::Twig;
     
    # creation d'un objet twig
    $twig->parsefile('PDC_FR_HPX_P_ACA_ARGGREG_DODBIS.xml');
     
    # racine du XML
    my $root = $twig->root;
     
    # Parcours des enfants SCHED_GROUP
    foreach my $TwigBaliseSched ( $root->children('SCHED_GROUP') ) {
      print "TABLE_NAME : ", $TwigBaliseSched->att('TABLE_NAME'), "\n";
     
      # Parcours des enfants JOB
      foreach my $TwigBaliseSched ( $TwigBaliseSched->children('JOB') ) {
        print "APPLICATION : ", $TwigBaliseSched->att('APPLICATION'), "\n";
      }
    }
    Résultat obtenu :
    Version 1 - utilisation de XML::Simple

    APPLICATION : PA_CADCASA_ACA
    APPLICATION : PA_CADCASA_ACA
    APPLICATION : PA_CADCASA_ACA
    TABLE_NAME : P_ACA_ARGGREG_DODBIS
    Version 2 - utilisation de XML::Twig

    TABLE_NAME : P_ACA_ARGGREG_DODBIS
    APPLICATION : PA_CADCASA_ACA
    APPLICATION : PA_CADCASA_ACA
    APPLICATION : PA_CADCASA_ACA
    Dans la version 1, il faut jouer avec les références de hash, de tableau en fonction des balises imbriquées. La récupération d'attributs ou de contenus de balises n'est pas dissocié. Bref, c'est un peu le bordel. Alors qu'en relisant le code version 2, un néophyte comprend facilement la logique du code.

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Par défaut
    Haha, merci beaucoup.
    Je vais en effet me lancer dans le twig qui a vraiment l'air simple.

    (tiens, histoire de te faire rire, voici mon bidouillage qui a marché pour faire afficher ma TABLE_NAME

    Je me considere un peu comme le mcGuyver du PERL en ce moment, je fais un code avec ce que j'ai: 2 ou 3 bout de ficelles
    Code : 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
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    use XML::Simple;
     
    my $parser = XML::Simple->new( KeepRoot => 1 );
     
    # Creation du fichier resultat
    my $FichierResulat = 'résultat.txt';
    open( my $FhResultat, '>', $FichierResulat )
      or die("Impossible d'ouvrir le fichier $FichierResulat\n$!");
     
    my $doc = $parser->XMLin('PDC_FR_HPX_P_ACA_ARGGREG_DODBIS.xml');
     
    # Tout le fichier XML est dans $doc sous forme d'arbre
    my %test = ( %{ $doc->{DEFTABLE}->{SCHED_GROUP} } );
    foreach my $SCHED_GROUP ( %{ $doc->{DEFTABLE}->{SCHED_GROUP} } ) {
    	if ( $SCHED_GROUP eq "TABLE_NAME" ) {
    		print {$FhResultat} "$test{TABLE_NAME}";
    	}
     
    }
     
    #print {$FhResultat} my $SCHED_GROUP->{TABLE_NAME};
    foreach my $JOB ( @{ $doc->{DEFTABLE}->{SCHED_GROUP}->{JOB} } ) {
    	print {$FhResultat} "\n\nApplication : ";
    	print {$FhResultat} $JOB->{APPLICATION};
    	print {$FhResultat} "\nAuthor : ";
    	print {$FhResultat} $JOB->{AUTHOR};
    	print {$FhResultat} "\nChange userID : ";
    	print {$FhResultat} $JOB->{CHANGE_USERID};
    	print {$FhResultat} "\nCommande line : ";
    	print {$FhResultat} $JOB->{CMDLINE};
    	print {$FhResultat} "\nNode ID : ";
    	print {$FhResultat} $JOB->{NODEID};
    	print {$FhResultat} "\nOwner : ";
    	print {$FhResultat} $JOB->{OWNER};
     
    }
     
    # Fermeture du fichier
    close($FhResultat);
    Aller, merci beaucoup, je m'y replonge en mode Twiguatueur

  4. #4
    Membre confirmé
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Par défaut
    Rebonjour,
    Finalement, je me suis mis a XML::simple car je ne parviens pas a installer XML::Twig sur eclipse.
    Bref, je me suis rendu compte que le code ne fonctionnai pas lorsqu'il n'y avait qu'un seul JOB.
    Exemple qui fonctionne:
    <DEFTABLE >
    <SCHED_GROUP>
    <JOB>
    </JOB>
    <JOB>
    </JOB>
    <JOB>
    </JOB>
    </SCHED_GROUP>
    </DEFTABLE>

    Exemple qui ne fonctionne pas:
    <DEFTABLE >
    <SCHED_GROUP>
    <JOB>
    </JOB>
    </SCHED_GROUP>
    </DEFTABLE>

    Auriez vous une idée? J'ai l'impression, d'apres le message d'erreur qu'il met ("Not an ARRAY reference at RecupInfoFichierV2.pl line 38.") qu'il n'apprecie pas les tableau a 1 seul JOB.
    Question subsidiaire; Comment avez vous réussis a avoir Twig sur windows?(ou peut être êtes vous sur Unix?)

  5. #5
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Le programme ne fonctionnant pas est celui avec XML::Simple (version1). Il faut utiliser la version 2 avec twig.

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Par défaut
    Ah, d'accord, décidément ce twig parait indispensable.
    Savez vous ou je peux récupérer les paquets ou librairie nécessaire pour l'avoir sous éclipse?
    La meilleure piste que j'ai trouvée c'est ceci:
    http://search.cpan.org/dist/XML-Twig/

    Mais je ne parviens pas a en tirer quelque chose.

    Merci,
    Cordialement,
    Benjamin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [DOM] Analyser un fichier XML en PHP
    Par wehtam dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 06/03/2008, 19h52
  2. [SimpleXML] Analyser un fichier XML
    Par gannher dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 12/02/2008, 13h27
  3. [XML] [EXPAT] Analyser un fichier XML
    Par namstou3 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 07/11/2007, 19h50
  4. [SimpleXML] Analyser un fichier XML avec PHP
    Par Someone86 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 10/08/2007, 10h43
  5. [XML] Analyser un fichier XML en PHP
    Par aroua dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 06/07/2007, 12h07

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