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.

2 réponses

1 2
Avatar
genomart
Après correction de ton XML

my $xml =<<'XML';
<?xml version="1.0" encoding="windows-1250"?>
<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_naf..."
accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/
services/nafz2man/contrat_naf...">
<description>Description</description>
</service>

<service name="RestitutionActivitesInterface"
wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/
nafz2man/contrat_naf..."
accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/
services/nafz2man/contrat_naf...">
<description>Description</description>
</service>
</services>
</contrat>
</contrats>
</mas>
</services>



XML

use XML::Twig;

my $tw = XML::Twig->new(
twig_handlers => {
contrat => &contrat,
}
)->parse($xml);

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


print "accessPoint : ",$TwContratFils->att('accessPoint'),"n";
}
}


N'oubliez pas de remettre parsefile à la place de parse dans mon
exemple.
Voici ce que j'obtiens :

Nom du contrat : CONTRAT_NAFZ2MAN_top2
accessPoint : 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/nafz2man/con trat_naf...
Avatar
apolloj
Merçi à vous 3 !
Désolé pour l'exemple XML un peu trituré !
J'étais sur la piste à l'instant même !


a écrit :
Après correction de ton XML

my $xml =<<'XML';
<?xml version="1.0" encoding="windows-1250"?>
<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_naf..."
accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/
services/nafz2man/contrat_naf...">
<description>Description</description>
</service>

<service name="RestitutionActivitesInterface"
wsdl="http://192.168.31.32:1511/mannaf_CA2_Z2/services/
nafz2man/contrat_naf..."
accessPoint="http://192.168.31.32:1511/mannaf_CA2_Z2/
services/nafz2man/contrat_naf...">
<description>Description</description>
</service>
</services>
</contrat>
</contrats>
</mas>
</services>



XML

use XML::Twig;

my $tw = XML::Twig->new(
twig_handlers => {
contrat => &contrat,
}
)->parse($xml);

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


print "accessPoint : ",$TwContratFils->att('accessPoint'),"n";
}
}


N'oubliez pas de remettre parsefile à la place de parse dans mon
exemple.
Voici ce que j'obtiens :

Nom du contrat : CONTRAT_NAFZ2MAN_top2
accessPoint : http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_naf...
accessPoint : http://192.168.31.32:1511/mannaf_CA2_Z2/services/nafz2man/contrat_naf...


1 2