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 :

Parse XML et extraction des données voulues


Sujet :

Modules Perl

  1. #21
    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 : 499 184
    Points
    499 184
    Par défaut
    Juste pour précision, dans un fichier, il n'y a qu'une seule balise <measTypes> ?
    Et celle-ci est associée l'unique balise measValues qui contient toutes les balises MeasValue avec les informations ?

  2. #22
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Oui, là il n'y en a qu'une car j'ai pris un extrait du fichier.

    En réalité il y en a plusieurs mais tu as raison, à chaque fois qu'il y a la balise measTypes, vient ensuite la balise measValues.

    Par exemple, il y a une balise measTypes avec 7 MeasType, puis dans le measValues il y a 250 (ça peut être différent) measObjInstId avec pour chacun d'eux 7 iValue.
    Et ça reprend avec une balise measTypes avec 15 MeasType etc...

  3. #23
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Petite précision, la balise measValues n'est pas une balise "enfant" de measTypes.

  4. #24
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    J'ai apporté une amélioration au code:
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::Twig;
     
    my $file = 'output-test.txt';
     
    my $twig1=XML::Twig->new(
    	TwigRoots => {'MeasType' => \&print_type, 'measObjInstId' => \&print_type, 'iValue' => \&print_type}
    	);
     
    $twig1->parsefile($file);
     
    my @type;
     
    sub print_type
    {my ($twig1, $elt)=@_;
    	# @type = $elt->text;
    	print $elt->text;
    	print "\n";
    	$twig1->purge;        #libère la mémoire
    }

  5. #25
    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 : 499 184
    Points
    499 184
    Par défaut
    Voici un exemple de programme testé :
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::Twig;
     
    my $fichier_xml = 'test.xml'; 
     
    my $twig = new XML::Twig( 
      Twig_handlers => { 
        'measTypes' => \&MeaTypes,
        'MeasValue' => \&AnalyseValues, 
      }, 
    );
     
    my @LesMeaTypes;
    $twig->parsefile($fichier_xml);
     
    # Stockage des MeaTypes 
    sub MeaTypes {
      my ( $twig, $TwigMeaTypes ) = @_;
     
      @LesMeaTypes = ();
      foreach my $TwigMeasType ( $TwigMeaTypes->children('MeasType') ) {
        push @LesMeaTypes, $TwigMeasType->text;
      }
     
      return;
    } 
     
    sub AnalyseValues {
      my ( $twig, $TwigMeasValue ) = @_;
     
      my $measObjInstId = $TwigMeasValue->first_child('measObjInstId')->text;
      print "measObjInstId : $measObjInstId\n";
      my $compteur = 0;
      foreach my $TwigMeasType ( $TwigMeasValue->first_child('measResults')->children('iValue') ) {
        print "$LesMeaTypes[$compteur] = ", $TwigMeasType->text, "\n";
        $compteur++;
      }
     
      return;
    }
    Je ne sais pas s'il répond par la suite à vos cas particuliers. Il faudrait déjà le tester.

  6. #26
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Maintenant le code (que j'ai mis plus haut) parse le fichier XML une seule fois (merci pour la remarque) et en résultat j'ai bien les valeurs une par une comme elle apparaisse dans le fichier XML.
    Reste à savoir comment les afficher comme je le veux?

  7. #27
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par djibril Voir le message
    Voici un exemple de programme testé :
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::Twig;
     
    my $fichier_xml = 'test.xml'; 
     
    my $twig = new XML::Twig( 
      Twig_handlers => { 
        'measTypes' => \&MeaTypes,
        'MeasValue' => \&AnalyseValues, 
      }, 
    );
     
    my @LesMeaTypes;
    $twig->parsefile($fichier_xml);
     
    # Stockage des MeaTypes 
    sub MeaTypes {
      my ( $twig, $TwigMeaTypes ) = @_;
     
      @LesMeaTypes = ();
      foreach my $TwigMeasType ( $TwigMeaTypes->children('MeasType') ) {
        push @LesMeaTypes, $TwigMeasType->text;
      }
     
      return;
    } 
     
    sub AnalyseValues {
      my ( $twig, $TwigMeasValue ) = @_;
     
      my $measObjInstId = $TwigMeasValue->first_child('measObjInstId')->text;
      print "measObjInstId : $measObjInstId\n";
      my $compteur = 0;
      foreach my $TwigMeasType ( $TwigMeasValue->first_child('measResults')->children('iValue') ) {
        print "$LesMeaTypes[$compteur] = ", $TwigMeasType->text, "\n";
        $compteur++;
      }
     
      return;
    }
    Je ne sais pas s'il répond par la suite à vos cas particuliers. Il faudrait déjà le tester.
    Tout simplement WOOOHHH.

    C'est exactement ce que je recherchais, ça marche nickel

    Un grand merci!

  8. #28
    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 : 499 184
    Points
    499 184
    Par défaut
    Si vous avez besoin de plus d'explications, n'hésitez pas.
    Sinon, comment faites-vous la conversion ?

  9. #29
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Voilà ce que j'utilisais (dans un autre script):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	if ($ligne =~ m{<measObjInstId>\s*(.*?)\s*</measObjInstId>}) {
    		$ligne =~ s/([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg;
    		$ligne =~ s/\s+//g;
    		print FILE_OUT "$ligne\n";
    	}
    Il faut que je l'adapte pour ce script maintenant.

  10. #30
    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 : 499 184
    Points
    499 184
    Par défaut
    Il suffit d'utiliser une procédure. Et pour mettre tout le résultat dans un fichier, voici le programme complet :
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::Twig;
     
    my $fichier_xml = 'test.xml'; 
    my $fichier_out = 'test.txt'; 
     
    my $twig = new XML::Twig( 
      Twig_handlers => { 
        'measTypes' => \&MeaTypes,
        'MeasValue' => \&AnalyseValues, 
      }, 
    );
     
    my @LesMeaTypes;
    open my $fh, '>', $fichier_out or die "Impossible de créer $fichier_out\n"; 
    $twig->parsefile($fichier_xml);
    close $fh;
    # Stockage des MeaTypes 
    sub MeaTypes {
      my ( $twig, $TwigMeaTypes ) = @_;
     
      @LesMeaTypes = ();
      foreach my $TwigMeasType ( $TwigMeaTypes->children('MeasType') ) {
        push @LesMeaTypes, $TwigMeasType->text;
      }
     
      return;
    } 
     
    sub AnalyseValues {
      my ( $twig, $TwigMeasValue ) = @_;
     
      my $measObjInstId = $TwigMeasValue->first_child('measObjInstId')->text;
      print {$fh} "measObjInstId : $measObjInstId\n";
      my $compteur = 0;
      foreach my $TwigMeasType ( $TwigMeasValue->first_child('measResults')->children('iValue') ) {
        print {$fh} conversion($LesMeaTypes[$compteur]), ' = ', $TwigMeasType->text, "\n";
        $compteur++;
      }
     
      return;
    } 
     
    sub conversion {
      my $mot = shift;
     
      $mot =~ s/([a-fA-F0-9][a-fA-F0-9])/chr(hex($1))/eg;
    	$mot =~ s/\s+//g;
      return $mot;
    }

  11. #31
    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 : 499 184
    Points
    499 184
    Par défaut
    Merci de penser au tag résolu si c'est OK.

  12. #32
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2012
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    C'est fait, j'attendais juste de voir si la partie "conversion" était ok pour toi, mais ce n'est pas le même sujet.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Extraction des données des tables SQL en XML avec MKFramework
    Par amooola86 dans le forum MkFramework
    Réponses: 16
    Dernier message: 27/06/2014, 10h15
  2. [JDOM] Extraction des données à partir du XML
    Par paulcomt dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 27/09/2010, 17h01
  3. extraction des données du xml et hashmap
    Par vanesa dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 05/03/2008, 17h57
  4. [DOM] parsing de xml et traitement des données
    Par vincent62149 dans le forum Format d'échange (XML, JSON...)
    Réponses: 2
    Dernier message: 04/03/2008, 10h06
  5. [débutant]extraction des données d'un fichier xml simple
    Par ekram dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 14/03/2007, 12h24

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