IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

utilisation de Simple::XML


Sujet :

Modules Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 53
    Points
    53
    Par défaut utilisation de Simple::XML
    Bonjour,

    j'ai un fichier xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?xml version='1.0' encoding='utf-8'?>
    <!-- # -*- coding: utf-8 -*- -->
    <tableau>
      <element nom="hydrogéne" numero="1" code="H"/>
      <element nom="hélium" numero="2" code="He"/>
      <element nom="lithium"  numero="3" code="Li"/>
    </tableau>
    que j'essaie d'analyser avec le module XML::Simple comme suit:
    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
    # -*- coding: utf-8 -*-
     
    use strict;
    use warnings;
     
    use XML::Simple; # qw(:strict)
     
    my $s1=<<EOF1;
    <?xml version='1.0' encoding='utf-8'?>
    <!-- # -*- coding: utf-8 -*- -->
    <tableau>
      <element nom="hydrogéne" numero="1" code="H"/>
      <element nom="hélium" numero="2" code="He"/>
      <element nom="lithium"  numero="3" code="Li"/>
    </tableau>
    EOF1
     
    my $elts = XMLin( $s1 , ForceArray => 1 , VarAttr => 'name', ContentKey => '-content' );
     
    use Data::Dumper;
     
    print Dumper($elts);
    j'obtiens le résultat suivant:
    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
    $VAR1 = {
              'element' => [
                           {
                             'nom' => "hydrog\x{e9}ne",
                             'numero' => '1',
                             'code' => 'H'
                           },
                           {
                             'nom' => "h\x{e9}lium",
                             'numero' => '2',
                             'code' => 'He'
                           },
                           {
                             'nom' => 'lithium',
                             'numero' => '3',
                             'code' => 'Li'
                           }
                         ]
            };
    J'essaie maintenant de parcourir les éléments de $elts. Ce dernier est un hash, $elts->{'element'} est un tableau, $elts->{'element'}[0] est hash et enfin $elts->{'element'}[0]{'nom'} donne hydrogène.

    Pour utiliser les résultat, j'ai utilisé la boucle suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my @elt=@{$elts->{'element'}};
    my $elt=@{$elts->{'element'}};
    for my $i  (0.. $elt-1 ) {
      print "$elt[$i]{'nom'}\t$elt[$i]{'code'}\t$elt[$i]{'numero'}\n";
    }
    ce qui me donne le résultat attendu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    hydrogène	H	1
    hélium	        He      2
    lithium	        Li      3
    ma question est la suivante pourquoi la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ( @{$elts->{'element'}} ) {
      print "$_{'nom'}\n";
    }
    me donne le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Use of uninitialized value in concatenation (.) or string at ex-3.pl line 52.
     
    Use of uninitialized value in concatenation (.) or string at ex-3.pl line 52.
     
    Use of uninitialized value in concatenation (.) or string at ex-3.pl line 52.
    et pourquoi la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach my $e ( @{$elts->{'element'}} ) {
      print "$e{'nom'}\n";  #-- ligne 56
    }
    entraîne une erreur de syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Global symbol "%e" requires explicit package name at ex-3.pl line 56.
    Execution of ex-3.pl aborted due to compilation errors.
    merci de votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    pas sûr que tu aies le droit d'injecter directement autre chose qu'un scalaire dans ta chaine de caractères

    essaies cela
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Il y a une doc sur les l'utilisation de Perl et XML que je recommande

  4. #4
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Par défaut
    Citation Envoyé par djibril Voir le message
    Il y a une doc sur les l'utilisation de Perl et XML que je recommande
    certes, mais pas sûr que ça aide vraiment ici...
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  5. #5
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par gorgonite Voir le message
    pas sûr que tu aies le droit d'injecter directement autre chose qu'un scalaire dans ta chaine de caractères

    essaies cela
    le hash %e n'existe pas, donc ça ne fonctionnera pas.

    Vous ne pouvez pas écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ( @{$elts->{'element'}} ) {
      print "$_{'nom'}\n";
    }
    Car $_ est une référence de hachage, il faut donc rajouter la flèche ->.

    Faites un tour sur la FAQ Perl sur les références pour mieux les comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ( @{$elts->{'element'}} ) {
      print "$_->{'nom'}\n";
    }
    C'est déjà mieux. Mais je vous répéte que XML::Simple est bien pour les XML qui sont simple . A éviter dès qu'on commence à avoir des attributs.

    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
    #!/usr/bin/perl
    use warnings;
    use strict;
     
    use XML::Simple; # qw(:strict)
     
    my $s1=<<EOF1;
    <?xml version='1.0' encoding='utf-8'?>
    <!-- # -*- coding: utf-8 -*- -->
    <tableau>
      <element nom="hydrogéne" numero="1" code="H"/>
      <element nom="hélium" numero="2" code="He"/>
      <element nom="lithium"  numero="3" code="Li"/>
    </tableau>
    EOF1
     
    my $elts = XMLin( $s1 , ForceArray => 1 , VarAttr => 'name', ContentKey => '-content' );
     
    foreach ( @{$elts->{'element'}} ) {
      print "$_->{'nom'}\n";
    }

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 61
    Points : 53
    Points
    53
    Par défaut utilisation de Simple::XML
    Merci beaucoup

    Quel module doit-on utiliser pour traiter plus facilement les attributs ?

    Plus généralement je cherche une présentation et une comparaison des différents modules de Perl pour traiter les documents XML, suivant les critères pourraient être

    • facilité d'utilisation

    • compatibilité



    Encore merci

  7. #7
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Dans ce thread, tu as le lien vers l'article. Tu peux y laisser un commentaire sur l'article, ça fait toujours plaisir .

    Sinon, tous les articles sur Perl se trouvent dans notre rubrique tutoriels.

    Voilà

Discussions similaires

  1. [MySQL] Optimisation de mon code utilisant simple xml
    Par heretik25 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 05/08/2011, 20h13
  2. [DOM] Lire un fichier simple XML en Java
    Par thomas.legoff dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 07/07/2006, 16h51
  3. utilisation de fichiers XML
    Par cfrelet dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 16/05/2006, 18h14
  4. [VB.Net] Comment utiliser du script xml ?
    Par manu49 dans le forum VB.NET
    Réponses: 3
    Dernier message: 13/04/2006, 10h21
  5. Utiliser un fichier XML sur un serveur FTP
    Par ired dans le forum Bases de données
    Réponses: 1
    Dernier message: 06/04/2005, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo