Publicité
+ Répondre à la discussion
Page 2 sur 2 PremièrePremière 12
Affichage des résultats 21 à 32 sur 32
  1. #21
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    16 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 16 487
    Points : 465 199
    Points
    465 199

    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 ?

    Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !

  2. #22
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2012
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : septembre 2012
    Messages : 52
    Points : 11
    Points
    11

    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
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2012
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : septembre 2012
    Messages : 52
    Points : 11
    Points
    11

    Par défaut

    Petite précision, la balise measValues n'est pas une balise "enfant" de measTypes.

  4. #24
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2012
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : septembre 2012
    Messages : 52
    Points : 11
    Points
    11

    Par défaut

    J'ai apporté une amélioration au code:
    Code perl :
    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
    16 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 16 487
    Points : 465 199
    Points
    465 199

    Par défaut

    Voici un exemple de programme testé :
    Code :
    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.

    Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !

  6. #26
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2012
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : septembre 2012
    Messages : 52
    Points : 11
    Points
    11

    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
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2012
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : septembre 2012
    Messages : 52
    Points : 11
    Points
    11

    Par défaut

    Citation Envoyé par djibril Voir le message
    Voici un exemple de programme testé :
    Code :
    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
    16 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 16 487
    Points : 465 199
    Points
    465 199

    Par défaut

    Si vous avez besoin de plus d'explications, n'hésitez pas.
    Sinon, comment faites-vous la conversion ?

    Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !

  9. #29
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2012
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : septembre 2012
    Messages : 52
    Points : 11
    Points
    11

    Par défaut

    Voilà ce que j'utilisais (dans un autre script):
    Code :
    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
    16 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 16 487
    Points : 465 199
    Points
    465 199

    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 :
    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;
    }

    Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !

  11. #31
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    avril 2004
    Messages
    16 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 16 487
    Points : 465 199
    Points
    465 199

    Par défaut

    Merci de penser au tag résolu si c'est OK.

    Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !

  12. #32
    Candidat au titre de Membre du Club
    Inscrit en
    septembre 2012
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : septembre 2012
    Messages : 52
    Points : 11
    Points
    11

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •