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 ?
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 ?
- Les meilleurs cours et tutoriels Perl et Perl 6 pour vous former ;
- FAQ Perl, Perl 6 et Perl/Tk d'entraide ;
- Les news sur la rubrique Perl ;
- S'abonner au compte Twitter de la rubrique Perl ;
- Mes tutoriels developpez.com.
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
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...
Petite précision, la balise measValues n'est pas une balise "enfant" de measTypes.
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 }
Voici un exemple de programme testé :
Je ne sais pas s'il répond par la suite à vos cas particuliers. Il faudrait déjà le tester.
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; }
- Les meilleurs cours et tutoriels Perl et Perl 6 pour vous former ;
- FAQ Perl, Perl 6 et Perl/Tk d'entraide ;
- Les news sur la rubrique Perl ;
- S'abonner au compte Twitter de la rubrique Perl ;
- Mes tutoriels developpez.com.
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
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?
Si vous avez besoin de plus d'explications, n'hésitez pas.
Sinon, comment faites-vous la conversion ?
- Les meilleurs cours et tutoriels Perl et Perl 6 pour vous former ;
- FAQ Perl, Perl 6 et Perl/Tk d'entraide ;
- Les news sur la rubrique Perl ;
- S'abonner au compte Twitter de la rubrique Perl ;
- Mes tutoriels developpez.com.
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
Voilà ce que j'utilisais (dans un autre script):
Il faut que je l'adapte pour ce script maintenant.
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 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; }
- Les meilleurs cours et tutoriels Perl et Perl 6 pour vous former ;
- FAQ Perl, Perl 6 et Perl/Tk d'entraide ;
- Les news sur la rubrique Perl ;
- S'abonner au compte Twitter de la rubrique Perl ;
- Mes tutoriels developpez.com.
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
Merci de penser au tag résolu si c'est OK.
- Les meilleurs cours et tutoriels Perl et Perl 6 pour vous former ;
- FAQ Perl, Perl 6 et Perl/Tk d'entraide ;
- Les news sur la rubrique Perl ;
- S'abonner au compte Twitter de la rubrique Perl ;
- Mes tutoriels developpez.com.
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager