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 :
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)'
            }
          }
  }
Je ne suis pas un spécialiste du XML et c'est la 1ère fois que j'ai à parser une telle structure.
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 :
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";
}
Il produit la sortie :
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
J'arrive à récupérer l'id du ticket après le parsing (boucle 'foreach my $issue', mais pas dans la fonction get_issue.
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.