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 ?
Version imprimable
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 ?
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:
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:
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; }
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 ?
Voilà ce que j'utilisais (dans un autre script):
Il faut que je l'adapte pour ce script maintenant.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 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; }
Merci de penser au tag résolu si c'est OK.
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.