Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

XML::Simple et hashs imbriqués

12 réponses
Avatar
apolloj
Bonjour,

Je souhaite utiliser LWP::Simple et XML::Simple pour tester des urls
inclus dans un fichier xml tel que celui-ci

<services>
-
<mas name="NAFZ2MAN">
<description>MAS</description>
-
<contrats>
-
<contrat name="CONTRAT_NAFZ2MAN_top2">
<description>contrat CONTRAT_NAFZ2MAN_top2</description>
-
<etatContrat>
-
<etat name=":etatContrat:stabilise">
<description>Stabilisé</description>
</etat>
</etatContrat>
-
<services>
-
<service name="RestitutionNomenclatureInterface"
wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionNomenclatureInterface?wsdl"
accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionNomenclatureInterface">
<description>Description</description>
</service>
-
<service name="RestitutionActivitesInterface"
wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionActivitesInterface?wsdl"
accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionActivitesInterface">
<description>Description</description>
.......
</service>
</contrat>
</contrats>
</mas>
</services>


Retour de Dumper($config) :

$VAR1 = {
'mas' => {
'name' => 'NAFZ2MAN',
'contrats' => {
'contrat' => {
'CONTRAT_NAFZ2MAN_top4' => {

'services' => {

'service' => {

'RechercheActiviteInterface' => {

'wsdl' =>
'http://192.168.31.32:1513/mannaf_CA3_Z2top4/services/nafz2man/contrat_nafz2man_top4/RechercheActiviteInterface?wsdl',


'accessPoint' =>
'http://192.168.31.32:1513/mannaf_CA3_Z2top4/services/nafz2man/contrat_nafz2man_top4/RechercheActiviteInterface',


'description' => 'Description'

},

'RestitutionActivitesInterface' => {

'wsdl'
=>
'http://192.168.31.32:1513/mannaf_CA3_Z2top4/services/nafz2man/contrat_nafz2man_top4/RestitutionActivitesInterface?wsdl',


'accessPoint' =>
'http://192.168.31.32:1513/mannaf_CA3_Z2top4/services/nafz2man/contrat_nafz2man_top4/RestitutionActivitesInterface',


'description' => 'Description'
......

J'ai fait un premier essai, mais la structure de données retournée (
bien qu'intéressante) est assez complexe
Voilà le bout de script :

#!/usr/bin/perl -w
use XML::Simple;
use Data::Dumper ;
my $config = XMLin('./fichier.xml');

print Dumper($config);

foreach $mas (keys %${config}) # test pour voir les clés de 2eme
niveau (je dois aller jusqu'au 5eme pour recupérer les URLs,ouf ..)
{
for $cles2 (keys %{$${config}{$mas}}) {
print " $cles2 \n";
}
}
retourne :


name
contrats
description


Quelqu'un peut il me dire s'il y'a un moyen plus rapide (options de
XML::Simple ou Data:: Dumper) d'accéder à la valeur wsdl et tester que
l'URL fonctionne ?
PS : j'aimerai aussi récupérer nom du contrat, services ..

Merçi d'avance.

10 réponses

1 2
Avatar
Paul Gaborit
À (at) Tue, 03 Mar 2009 22:58:31 +0100,
apolloj écrivait (wrote):
Je souhaite utiliser LWP::Simple et XML::Simple pour tester des urls
inclus dans un fichier xml tel que celui-ci



XML::Simple est vraiment trop simpliste. Au final, dès qu'un fichier
XML est un tant soit peu complexe, l'utilisation de XML::Simple n'est
pas simple du tout.

Je vous conseille vraiment XML::Twig qui semble a priori plus complexe
mais est en fait bien plus puissant et simple à utiliser.

Un autre conseil est d'apprendre des rudiments de XSL et de
XPath. C'est fondamental pour extraire facilement des informations
d'un fichier XML de manière efficace.

Pour le reste de votre question, il faudrait une description précise
des fichiers XML qui vous souhaitez traiter (je n'ai pas vraiment
regarder le fichier fourni).

Pour tester des URL, ça dépend du résultat attendu. S'il vous suffit
de savoir que le serveur répond correctement sur cet URL, vous pouvez
faire la requête et tester le "status" obtenu. Après, à vous de
décider quelles valeurs sont acceptables (2xx) ou si c'est une erreur
(4xx) ou s'il faut chercher plus loin (3xx) ou s'il faut réessayer
plus tard (5xx) ou encore si votre URL est correct (1xx)...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
mirod
apolloj wrote:
Bonjour,

Je souhaite utiliser LWP::Simple et XML::Simple pour tester des urls
inclus dans un fichier xml tel que celui-ci

<services>
-
<mas name="NAFZ2MAN">
<description>MAS</description>
-
<contrats>
-
<contrat name="CONTRAT_NAFZ2MAN_top2">
<description>contrat CONTRAT_NAFZ2MAN_top2</description>
-
<etatContrat>
-
<etat name=":etatContrat:stabilise">
<description>Stabilisé</description>
</etat>
</etatContrat>
-
<services>
-
<service name="RestitutionNomenclatureInterface"
wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionNomenclatureInterface?wsdl"
accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionNomenclatureInterface">
<description>Description</description>
</service>
-
<service name="RestitutionActivitesInterface"
wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionActivitesInterface?wsdl"
accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionActivitesInterface">
<description>Description</description>
.......
</service>
</contrat>
</contrats>
</mas>
</services>
[...]

Quelqu'un peut il me dire s'il y'a un moyen plus rapide (options de
XML::Simple ou Data:: Dumper) d'accéder à la valeur wsdl et tester que
l'URL fonctionne ?
PS : j'aimerai aussi récupérer nom du contrat, services ..

Merçi d'avance.



A la surprise générale, je vais proposer une solution avec XML::Twig.

Un "handler" sur service to donne accès à l'élément, comme ça tu ne t'occupe pas
du niveau ou il est (si tu t'interesses a l'attribut wsld sur d'autres éléments,
tu peux mettre le handler sur '[@wsdl]')


#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( twig_handlers => { service => &service })
->parsefile( "wsdl.xml");

sub service
{ my( $t, $service)= @_;
print "nom: ", $service->field( 'description'), "n";
print "url: ", $service->att( 'wsdl'), "n";
}

Note que si les données dans ton example étaient valide, ça serait plus facile,
j'ai du tripatouiller le XML un moment pour pouvoir tester...

--
mirod
Avatar
Paul Gaborit
À (at) Wed, 04 Mar 2009 09:13:21 +0100,
mirod écrivait (wrote):
A la surprise générale, je vais proposer une solution avec XML::Twig.

Un "handler" sur service to donne accès à l'élément, comme ça tu ne
t'occupe pas du niveau ou il est (si tu t'interesses a l'attribut wsld
sur d'autres éléments, tu peux mettre le handler sur '[@wsdl]')


#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( twig_handlers => { service => &service })
->parsefile( "wsdl.xml");

sub service
{ my( $t, $service)= @_;
print "nom: ", $service->field( 'description'), "n";
print "url: ", $service->att( 'wsdl'), "n";
}

Note que si les données dans ton example étaient valide, ça serait
plus facile, j'ai du tripatouiller le XML un moment pour pouvoir
tester...



Merci Michel pour ce bout de code qui illustre de manière bien plus
parlante ce que j'essayais de dire maladroitement dans ma réponse (en
plus, toi, tu as pris le temps de décortiquer le bout de fichier XML).

Vive XML::Twig et longue vie à Mirod... ou le contraire si tu
préfères ! ;-)

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
mirod
Paul Gaborit wrote:

Merci Michel pour ce bout de code qui illustre de manière bien plus
parlante ce que j'essayais de dire maladroitement dans ma réponse.



Un bout de code vaut mille mots?

--
mirod
Avatar
Paul Gaborit
À (at) Wed, 04 Mar 2009 11:56:37 +0100,
mirod écrivait (wrote):
Paul Gaborit wrote:

Merci Michel pour ce bout de code qui illustre de manière bien plus
parlante ce que j'essayais de dire maladroitement dans ma réponse.



Un bout de code vaut mille mots?



Bien plus que ça car derrière ce p'tit bout de code il y a tout
XML::Twig qui contient bien plus que mille mots ! ;-)

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
apolloj
Bonjour, de XML

Merçi mirod et Paul, excellente solution !
J'ai beaucoup apprécié vote exemple (à recommander):
http://xmltwig.com/talk/twig_pour_les_nuls/twig_pour_les_nuls.odp

Dernière question ( je ne suis pas un spécialiste de XML) :

J'ai bien compris que twig parsait selon les tags fermants.
Est il possible d'avoir une sortie (des attributs) selon l'ordre des
tags ouvrants ?

Cordialement.

mirod a écrit :
apolloj wrote:
Bonjour,

Je souhaite utiliser LWP::Simple et XML::Simple pour tester des urls
inclus dans un fichier xml tel que celui-ci

<services>
-
<mas name="NAFZ2MAN">
<description>MAS</description>
-
<contrats>
-
<contrat name="CONTRAT_NAFZ2MAN_top2">
<description>contrat CONTRAT_NAFZ2MAN_top2</description>
-
<etatContrat>
-
<etat name=":etatContrat:stabilise">
<description>Stabilisé</description>
</etat>
</etatContrat>
-
<services>
-
<service name="RestitutionNomenclatureInterface"
wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionNomenclatureInterface?wsdl"

accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionNomenclatureInterface">

<description>Description</description>
</service>
-
<service name="RestitutionActivitesInterface"
wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionActivitesInterface?wsdl"

accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionActivitesInterface">

<description>Description</description>
.......
</service>
</contrat>
</contrats>
</mas>
</services>
[...]

Quelqu'un peut il me dire s'il y'a un moyen plus rapide (options de
XML::Simple ou Data:: Dumper) d'accéder à la valeur wsdl et tester que
l'URL fonctionne ?
PS : j'aimerai aussi récupérer nom du contrat, services ..

Merçi d'avance.



A la surprise générale, je vais proposer une solution avec XML::Twig.

Un "handler" sur service to donne accès à l'élément, comme ça tu ne
t'occupe pas du niveau ou il est (si tu t'interesses a l'attribut wsld
sur d'autres éléments, tu peux mettre le handler sur '[@wsdl]')


#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( twig_handlers => { service => &service })
->parsefile( "wsdl.xml");

sub service
{ my( $t, $service)= @_;
print "nom: ", $service->field( 'description'), "n";
print "url: ", $service->att( 'wsdl'), "n";
}

Note que si les données dans ton example étaient valide, ça serait plus
facile, j'ai du tripatouiller le XML un moment pour pouvoir tester...



Avatar
Paul Gaborit
À (at) Wed, 04 Mar 2009 22:41:36 +0100,
apolloj écrivait (wrote):
Dernière question ( je ne suis pas un spécialiste de XML) :

J'ai bien compris que twig parsait selon les tags fermants.
Est il possible d'avoir une sortie (des attributs) selon l'ordre des
tags ouvrants ?



Je ne suis pas sûr de bien comprendre la question, je réponds donc
peut-être à côté...

Lorsque XML::TWIG appelle un handler attaché à un élément XML, il
l'appelle avec l'élément complet (la balise ouvrante et ses attributs,
le contenu et la balise fermante) déjà analysé et prêt à être
exploité. Il est donc normal que ce handler ne soit appelé que lorsque
tout l'élément est déjà lu. Mais les éléments sont quand même traités
dans l'ordre où ils apparaissent dans le document XML.

Je ne vois pas dans quelles situations (sauf éléments identiques
imbriqués ce qui ne me semble pas être le cas ici) le handler ne
serait pas appelé dans le bon ordre...

Mais peut-être qu'un petit exemple de document XML posant problème
pourrait m'éclairer...

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>
Avatar
mirod
apolloj wrote:
Bonjour, de XML

Merçi mirod et Paul, excellente solution !
J'ai beaucoup apprécié vote exemple (à recommander):
http://xmltwig.com/talk/twig_pour_les_nuls/twig_pour_les_nuls.odp

Dernière question ( je ne suis pas un spécialiste de XML) :

J'ai bien compris que twig parsait selon les tags fermants.
Est il possible d'avoir une sortie (des attributs) selon l'ordre des
tags ouvrants ?

Cordialement.

mirod a écrit :
apolloj wrote:
Bonjour,

Je souhaite utiliser LWP::Simple et XML::Simple pour tester des urls
inclus dans un fichier xml tel que celui-ci

<services>
-
<mas name="NAFZ2MAN">
<description>MAS</description>
-
<contrats>
-
<contrat name="CONTRAT_NAFZ2MAN_top2">
<description>contrat CONTRAT_NAFZ2MAN_top2</description>
-
<etatContrat>
-
<etat name=":etatContrat:stabilise">
<description>Stabilisé</description>
</etat>
</etatContrat>
-
<services>
-
<service name="RestitutionNomenclatureInterface"
wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionNomenclatureInterface?wsdl"

accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionNomenclatureInterface">

<description>Description</description>
</service>
-
<service name="RestitutionActivitesInterface"
wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionActivitesInterface?wsdl"

accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_top2/RestitutionActivitesInterface">

<description>Description</description>
.......
</service>
</contrat>
</contrats>
</mas>
</services>
[...]

Quelqu'un peut il me dire s'il y'a un moyen plus rapide (options de
XML::Simple ou Data:: Dumper) d'accéder à la valeur wsdl et tester que
l'URL fonctionne ?
PS : j'aimerai aussi récupérer nom du contrat, services ..

Merçi d'avance.


A la surprise générale, je vais proposer une solution avec XML::Twig.

Un "handler" sur service to donne accès à l'élément, comme ça tu ne
t'occupe pas du niveau ou il est (si tu t'interesses a l'attribut wsld
sur d'autres éléments, tu peux mettre le handler sur '[@wsdl]')


#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( twig_handlers => { service => &service })
->parsefile( "wsdl.xml");

sub service
{ my( $t, $service)= @_;
print "nom: ", $service->field( 'description'), "n";
print "url: ", $service->att( 'wsdl'), "n";
}

Note que si les données dans ton example étaient valide, ça serait plus
facile, j'ai du tripatouiller le XML un moment pour pouvoir tester...





Tu peux utiliser l'option start_tag_handlers, qui te permet d'appeler un handler
quand la balise ouvrante est parsée. Le handler reçoit en argument le twig et
l'élément, qui à ce moment là ne contient encore rien, sauf ses attributs.

C'est ça que tu cherchais?

--
mirod
Avatar
genomart
On 5 mar, 07:04, mirod wrote:
apolloj wrote:
> Bonjour, de XML

> Merçi mirod et Paul, excellente solution !
> J'ai beaucoup apprécié vote exemple (à recommander):
>http://xmltwig.com/talk/twig_pour_les_nuls/twig_pour_les_nuls.odp

> Dernière question ( je ne suis pas un spécialiste de XML) :

> J'ai bien compris que twig parsait selon les tags fermants.
> Est il possible d'avoir une sortie (des attributs) selon l'ordre des
> tags ouvrants ?

> Cordialement.

> mirod a écrit :
>> apolloj wrote:
>>> Bonjour,

>>> Je souhaite utiliser LWP::Simple et XML::Simple pour tester des urls
>>> inclus dans un fichier xml tel que celui-ci

>>> <services>
>>> -
>>> <mas name="NAFZ2MAN">
>>> <description>MAS</description>
>>> -
>>> <contrats>
>>> -
>>> <contrat name="CONTRAT_NAFZ2MAN_top2">
>>> <description>contrat CONTRAT_NAFZ2MAN_top2</description>
>>> -
>>> <etatContrat>
>>> -
>>> <etat name=":etatContrat:stabilise">
>>> <description>Stabilisé</description>
>>> </etat>
>>> </etatContrat>
>>> -
>>> <services>
>>> -
>>> <service name="RestitutionNomenclatureInterface"
>>> wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/con trat_naf..."

>>> accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2 man/contrat_naf...">

>>> <description>Description</description>
>>> </service>
>>> -
>>> <service name="RestitutionActivitesInterface"
>>> wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/con trat_naf..."

>>> accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2 man/contrat_naf...">

>>> <description>Description</description>
>>> .......
>>> </service>
>>> </contrat>
>>> </contrats>
>>> </mas>
>>> </services>
>>> [...]

>>> Quelqu'un peut il me dire s'il y'a un moyen plus rapide (options de
>>> XML::Simple ou Data:: Dumper) d'accéder à la valeur wsdl et teste r que
>>> l'URL fonctionne ?
>>> PS : j'aimerai aussi récupérer nom du contrat, services ..

>>> Merçi d'avance.
>> A la surprise générale, je vais proposer une solution avec XML::Tw ig.

>> Un "handler" sur service to donne accès à l'élément, comme ç a tu ne
>> t'occupe pas du niveau ou il est (si tu t'interesses a l'attribut wsld
>> sur d'autres éléments, tu peux mettre le handler sur '[@wsdl]')

>> #!/usr/bin/perl

>> use strict;
>> use warnings;

>> use XML::Twig;

>> XML::Twig->new( twig_handlers => { service => &service })
>>          ->parsefile( "wsdl.xml");

>> sub service
>>   { my( $t, $service)= @_;
>>     print "nom: ", $service->field( 'description'), "n";
>>     print "url: ", $service->att( 'wsdl'), "n";
>>   }

>> Note que si les données dans ton example étaient valide, ça sera it plus
>> facile, j'ai du tripatouiller le XML un moment pour pouvoir tester...

Tu peux utiliser l'option start_tag_handlers, qui te permet d'appeler un handler
quand la balise ouvrante est parsée. Le handler reçoit en argument le twig et
l'élément, qui à ce moment là ne contient encore rien, sauf ses a ttributs.

C'est ça que tu cherchais?

--
mirod



Ah lala, XML::Twig, super module, je lui souhaite longue vie.
Avatar
apolojnet
On 5 mar, 07:04, mirod wrote:
apolloj wrote:
> Bonjour, de XML

> Merçi mirod et Paul, excellente solution !
> J'ai beaucoup apprécié vote exemple (à recommander):
>http://xmltwig.com/talk/twig_pour_les_nuls/twig_pour_les_nuls.odp

> Dernière question ( je ne suis pas un spécialiste de XML) :

> J'ai bien compris que twig parsait selon les tags fermants.
> Est il possible d'avoir une sortie (des attributs) selon l'ordre des
> tags ouvrants ?

> Cordialement.

> mirod a écrit :
>> apolloj wrote:
>>> Bonjour,

>>> Je souhaite utiliser LWP::Simple et XML::Simple pour tester des urls
>>> inclus dans un fichier xml tel que celui-ci

>>> <services>
>>> -
>>> <mas name="NAFZ2MAN">
>>> <description>MAS</description>
>>> -
>>> <contrats>
>>> -
>>> <contrat name="CONTRAT_NAFZ2MAN_top2">
>>> <description>contrat CONTRAT_NAFZ2MAN_top2</description>
>>> -
>>> <etatContrat>
>>> -
>>> <etat name=":etatContrat:stabilise">
>>> <description>Stabilisé</description>
>>> </etat>
>>> </etatContrat>
>>> -
>>> <services>
>>> -
>>> <service name="RestitutionNomenclatureInterface"
>>> wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/con trat_naf..."

>>> accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2 man/contrat_naf...">

>>> <description>Description</description>
>>> </service>
>>> -
>>> <service name="RestitutionActivitesInterface"
>>> wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/con trat_naf..."

>>> accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2 man/contrat_naf...">

>>> <description>Description</description>
>>> .......
>>> </service>
>>> </contrat>
>>> </contrats>
>>> </mas>
>>> </services>
>>> [...]

>>> Quelqu'un peut il me dire s'il y'a un moyen plus rapide (options de
>>> XML::Simple ou Data:: Dumper) d'accéder à la valeur wsdl et teste r que
>>> l'URL fonctionne ?
>>> PS : j'aimerai aussi récupérer nom du contrat, services ..

>>> Merçi d'avance.
>> A la surprise générale, je vais proposer une solution avec XML::Tw ig.

>> Un "handler" sur service to donne accès à l'élément, comme ç a tu ne
>> t'occupe pas du niveau ou il est (si tu t'interesses a l'attribut wsld
>> sur d'autres éléments, tu peux mettre le handler sur '[@wsdl]')

>> #!/usr/bin/perl

>> use strict;
>> use warnings;

>> use XML::Twig;

>> XML::Twig->new( twig_handlers => { service => &service })
>>          ->parsefile( "wsdl.xml");

>> sub service
>>   { my( $t, $service)= @_;
>>     print "nom: ", $service->field( 'description'), "n";
>>     print "url: ", $service->att( 'wsdl'), "n";
>>   }

>> Note que si les données dans ton example étaient valide, ça sera it plus
>> facile, j'ai du tripatouiller le XML un moment pour pouvoir tester...





Tu peux utiliser l'option start_tag_handlers, qui te permet d'appeler un handler
quand la balise ouvrante est parsée. Le handler reçoit en argument le twig et
l'élément, qui à ce moment là ne contient encore rien, sauf ses a ttributs.

C'est ça que tu cherchais?

--
mirod



Bonjour,

en fait, si j'utilise le code suivant

#!/usr/bin/perl
use warnings;
use XML::Twig;

my $tw= XML::Twig->new( twig_handlers => { contrat =>&contrat,
service => &service })->parsefile("file.xml");

sub contrat
{
my($tw,$contrat)= @_;
print "Nom du contrat : ", $contrat->att('name'), "n";

}

sub service
{
my($tw,$service)= @_;
print " AccessPoint : ", $service->att('accessPoint'), "n";

}

J'obtiens :
AccessPoint :
http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_ top2/RestitutionNomenclatureInterface
AccessPoint :
http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_nafz2man_ top2/RestitutionActivitesInterface
.....
Nom du contrat : CONTRAT_NAFZ2MAN_top2
AccessPoint :
http://192.168.31.32:1513/mannaf_CA3_Z2top4/services/nafz2man/contrat_nafz2 man_top4/RestitutionActivitesInterface
AccessPoint :
http://192.168.31.32:1513/mannaf_CA3_Z2top4/services/nafz2man/contrat_nafz2 man_top4/RestitutionNaturesActivitesInterface
....
Nom du contrat : CONTRAT_NAFZ2MAN_top4

je voudrai obtenir :

Nom du contrat :

CONTRAT_NAFZ2MAN_top2
puis les AccessPoint ..

Merçi d'avance
1 2