Bonjour,
notre système de tickets (Redmine) propose une API me servant les informations au format XML.
Ci-après, un exemple édulcoré de ces données :
Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 <?xml version="1.0" encoding="UTF-8"?> <issues total_count="2260" offset="0" limit="100" type="array"> <issue> <id>9399</id> <project id="40" name="PE (Prestations Espèces)"/> <tracker id="15" name="DT (Demande de Travaux)"/> <status id="3" name="Réalisé"/> </issue> <issue> <id>9398</id> <project id="63" name="-- DTA"/> <tracker id="15" name="DT (Demande de Travaux)"/> <status id="3" name="Réalisé"/> </issue> </issues>
Je souhaite parser ce fichier pour créer un hash qui sera traité par la suite :
Je ne suis pas un spécialiste du XML et c'est la 1ère fois que j'ai à parser une telle structure.
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 %h { 9399 => { project => { id => 40 name => 'PE (Prestations Espèces)' } tracker => { id => 15 name => 'DT (Demande de Travaux)' } } 9398 => { project => { id => 63 name => '-- DTA' } tracker => { id => 15 name => 'DT (Demande de Travaux)' } } }
J'ai choisi le module XML::Twig, lu le tuto sur developpez.com et celui sur http://xmltwig.org mais suis un peu perdu, n'ayant pas beaucoup de temps devant moi.
Mon script de test est :
Il produit la sortie :
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 #!/usr/bin/env perl use strict; use warnings; use Data::Dumper; use XML::Twig; use feature 'say'; my $xml_file = shift; my $twig = new XML::Twig ( twig_handlers => { id => \&get_issue, project => \&get_project_atts, } ); $twig->parsefile( $xml_file); my $root =$twig->root; # racine de twig (issues) my @issues = $root->children; # liste des ticket (issue) foreach my $issue ( @issues ) { say "From pgm - Issue : ", $issue->field('id'); } sub get_issue { my ( $t, $elt ) = @_; # KO - my $issue_id = $elt->first_child('issue')->field('id'); # my $issue_id = $elt->first_child('id'); # say "From handler - Issue id : $issue_id"; } sub get_project_atts { my ( $t, $elt ) = @_; my $project_id = $elt->{'att'}->{'id'}; my $project_name = $elt->{'att'}->{'name'}; say "From handler - Project id : $project_id _ Project name : $project_name"; }
J'arrive à récupérer l'id du ticket après le parsing (boucle 'foreach my $issue', mais pas dans la fonction get_issue.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 From handler - Project id : 40 _ Project name : PE (Prestations Esp▒ces) From handler - Project id : 63 _ Project name : -- DTA From pgm - Issue : 9399 From pgm - Issue : 9398
Si j'ai bien compris, les handlers sont appellés à chaque fois que le tag est rencontré, me permettant de retrouver les attributs ; par contre la bouche 'foreach' s'exécute après le parsing.
Je n'arrive pas non plus à récupérer l'id du ticket dans le get_project_atts
Je sèche lamentablement et ai du mal à voir comment lier tout cela pour alimenter le hash.
Merci pour votre aide.
Partager