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

Langage Perl Discussion :

Problème de conversion d'une structure d'arbre sous forme d'un fichier xml


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut Problème de conversion d'une structure d'arbre sous forme d'un fichier xml
    Bonjour,
    J'ai une variable contenant une structure arborescente en perl, c'est à dire l'arbre contient des éléments dont chaque élément possède des fils. Pour mieux expliquer, mon arbre est défini d'une façon récursive.
    Je vous donnerez ci_après une vue à propos de mon arbre.
    Voila la classe définissant mon arbre.
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    package arbre;
    use warnings;
    use Data::Dumper;
    use strict;
    my $nbre_noeuds = 0;
    my $nbre_feuilles = 0;
    my $nbre_fils = 0;
     
    sub new
    {
       my ($class,$nom,$type) = @_;
     
       my $this = {};
       bless($this, $class);
       $this->{DEBUT} = undef;
       $this->{FIN} = undef;
       $this->{NAME} = $nom;
       $this->{TYPE} = $type;
       $this->{TYPE_DATA} = undef;
       $this->{ _REGLE_G } = undef;
       $this->{ _REGLE_D } = undef;
       $this->{RESULTAT} = [];
       $this->{FILS} = [];
       $this->{PARENT} = undef;
       $this->{DELDEBUT_G} = undef;
       $this->{DELFIN_G} = undef;
       $this->{DELDEBUT_D} = undef;
       $this->{DELFIN_D} = undef;
       $this->{EXEMPLE_G} = [];
       $this->{EXEMPLE_D} = [];
       $this->{OCCURENCE} = [];
       $nbre_noeuds++;
       return $this;
    }
     
    sub inserer_fils
    {  
       my ($this,$tree) = @_;  
     
          push @{$this->{FILS}}, $tree;
          $tree->{PARENT}=$this;
          $nbre_fils++;
     
    }
     
    sub ajouter_noeud_fils {
     
        my ($this,$nom_parent,$nom_noeud,$type_noeud) = @_;
         if ($nom_parent eq $this->{NAME}) {
             my $t = arbre->new($nom_noeud,$type_noeud);  
             $this->inserer_fils($t);   
             $t->{NAME} = $nom_noeud;
             $t->{TYPE} = $type_noeud;
         }
    else {
     
           foreach my $v ( @{$this->{FILS}} )
        { 
     
              if ($nom_parent eq $v->{NAME})  {
     
                  my $t = modelexml->new($nom_noeud,$type_noeud);  
                  $v->inserer_fils($t);   
                  $t->{NAME} = $nom_noeud;
                  $t->{TYPE} = $type_noeud;
                 $t->ajouter_noeud_fils($nom_parent,$nom_noeud,$type_noeud);    
              }
     
           }
        }
     
    }
     
    1;
    Mon problème est que après la création des objets de la classe arbre, je voulais enregistrer ces objets pour pouvoir les utiliser après, alors moi ce que j'ai utilisé comme méthode est l'astuce qui permet de convertir une structure perl sous forme d'un fichier xml. À cet effet, j'ai utilisé la méthode XML::Simple. Dans ce qui suit, vous trouverez un programme principal illustrant bien mon problème.
    Programme principal:
    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
    40
    41
    42
     
    use arbre;
    use strict;
    use warnings;
    use Data::Dumper;
    use Clone qw(clone);
    use XML::Simple;
     
    my $t = arbre->new('ListePricipale','liste');#La racine de l arbre representant le noeud principal Liste
    $t->{DEBUT} = 1.12;
    $t->{FIN} = 1000.234;
     
    print"L'AFFICHAGE DE L'ARBRE AVANT L'INSERTION\n";
    print Dumper($arbre)."\n";
     
    $nom_parent = "ListePricipale";
    $nom_noeud = "tuple";
    $type_noeud = "TUPLE";
     
    #Insertion du noeud tuple à la racine de l'arbre
    $t->ajouter_noeud_fils($nom_parent,$nom_noeud,$type_noeud);
    #Ajout des attributs pour le noeud tuple
    $t->{FILS}->[0]->{DEBUT} = 13.20;
    $t->{FILS}->[0]->{FIN} = 500.4;
     
    #Insertion du noeud feuille au noeud tuple
    $t->ajouter_noeud_fils($t->{FILS}->[0]->{NAME},'feuille','FEUILLE');
    #Ajout des attributs pour le noeud feuille
    $t->{FILS}->[0]->{FILS}->[0]->{DEBUT} = 300.1;
    $t->{FILS}->[0]->{FILS}->[0]->{FIN} = 400.12;
     
    #Création d'une copie de l'arbre $t
    my $copie_t = clone($t);
     
    # créer un objet xml
    $xml = new XML::Simple (NoAttr=>1, RootName=>'data');
     
    # convertir la référence de la copie d'arbre  en document XML
    $data = $xml->XMLout($copie_t);
     
    # accéder aux données XML
    print Dumper($data);
    je n'ai pas réussi à créer le fichier xml représentant la structure d'arbre. Et ce que j'ai compris c'est que cette méthode marche bien quand on utilise une structure tableau, alors pour le convertir en fichier xml, il suffit juste d'appeler la méthode XMLout utilisant comme paramètre une référence vers ce tableau:
    $data = $xml->XMLout(\@tableau);
    Donc, s'il vous plait si quelqu'un pourrez m'aider de lever ce problème j'attends avec impatience la réponse.
    Merci à vous tous.

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    As-tu regardé du coté du CPAN :
    - XML::TreePP
    - Data::asXML
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    As-tu regardé du coté du CPAN :
    - XML::TreePP
    - Data::asXML
    Salut Philou, j'ai bien essayé le module que vous me l'avez envoyé, alors ca marche bien avec des arbres de structure imbriquée comme je voulais, mais je n'ai pas réussi à l'appliquer sur mon arbre. Le programme se bloque et n'affiche rien comme erreur, peut être ca est du parce que ma structure d'arbre est un objet d'une classe et si je veux l'afficher en sortie je vois que chaque élément est précédé d'un bless.
    J'ai essayé de faire une petite comparaison avec mon arbre et les autres arbres que j'a créé et qui marchaient bien avec ce module, alors je remarquais que la seule différence est le mot bless qui précède chaque élément de l'arbre.
    Si vous avez une propositions à essayer svp n'hésiter pas à me l'envoyer.
    Bon courage.
    Achir.

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Le mot "bless" vient du fait qu'une structure (un hash) qui est aussi un objet doit être "blessed" (béni), à savoir, que la fonction bless doit être appelée avec la référence du l'objet et le nom de sa classe.

    Cette information subsiste lors de la sérialisation en XML, sans doute, mais il est possible que certaines configurations permettent de le supprimer. Avez-vous consulté la totalité de l'aide sur ces modules ?

    Réponse pour Data::asXML à lire dans TODO :
    * what to do with blessed? do the same as JSON::XS does?
    (visiblement, le cas n'est pas traité par ce module)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Le mot "bless" vient du fait qu'une structure (un hash) qui est aussi un objet doit être "blessed" (béni), à savoir, que la fonction bless doit être appelée avec la référence du l'objet et le nom de sa classe.

    Cette information subsiste lors de la sérialisation en XML, sans doute, mais il est possible que certaines configurations permettent de le supprimer. Avez-vous consulté la totalité de l'aide sur ces modules ?

    Réponse pour Data::asXML à lire dans TODO :
    (visiblement, le cas n'est pas traité par ce module)
    Salut, J'ai essayé tous à propos des modules que vous m'avez envoyé mais vraiment y a rien qui marche bien, je ne sais pas c'est quoi le problème.
    - Avec le module JSON, j'ai essayé ce qui suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $jsontext = JSON::XS->new();
    $jsontext = $jsontext->allow_blessed();
    $jsontext = $jsontext->convert_blessed();
    $jsontext -> encode ($arbre);
    Mais toujours y a rien dans la variable $jsontext.

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Le mot "bless" vient du fait qu'une structure (un hash) qui est aussi un objet doit être "blessed" (béni), à savoir, que la fonction bless doit être appelée avec la référence du l'objet et le nom de sa classe.

    Cette information subsiste lors de la sérialisation en XML, sans doute, mais il est possible que certaines configurations permettent de le supprimer. Avez-vous consulté la totalité de l'aide sur ces modules ?

    Réponse pour Data::asXML à lire dans TODO :
    (visiblement, le cas n'est pas traité par ce module)
    Salut,
    Ce que je veux par la sérialisation c'est d'enregistrer l'instance de mon arbre que je créais durant l'exécution du programme afin de pouvoir l'utiliser après directement et sans le recréer. Parce que mon application passe par 2 phases:
    - La phase d'apprentissage : et la ou on doit créer l'arbre global et faire l'apprentissage pour permettre l'ajouter quelques attributs importants.
    - La phase d'extraction : Permet d'utiliser l'arbre global pour procéder à l'extraction des données.
    Donc ce que je voulais c'est d'avoir une méthode pour sérialiser mon objet arbre afin d'éviter que je fasse chaque fois la phase d'apprentissage ( cette phase est compliquée et demande plus du temps).
    Je suis vraiment bloqué la dessus.
    S'il vous plait s'il y a quelqu'un qui peut m'aider je suis la pour la réponse et toute autres propositions.
    Merci.
    Achir.

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Euh... dans ce cas, il ne faut pas utiliser un formatage XML, mais utiliser Data::Dumper.
    Je fais cela très couramment.
    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
     
    use Data::Dumper;
    our $my_data;
     
    my $my_data_file = "my_data.pm";
     
    # si le fichier de donnée existe, le charger dans $my_data
    if (-f $my_data_file) {
      unless (my $return = do $my_data_file) {
        die "couldn't parse $my_data_file: $@\n" if $@;
        die "couldn't do $my_data_file: $!\n"    unless defined $return;
        die "couldn't run $my_data_file\n"       unless $return;
      }
    }
     
    ...
     
    # sauver $my_data
    open my $DATA_FILE, ">", $my_data_file or die "Can't open $my_data_file : $!";
    print {$DATA_FILE} Data::Dumper->Dump([$my_data], [qw(*my_data)]);
    print {$DATA_FILE} "1;";
    close $DATA_FILE;
    Indépendamment de Data::Dumper, il existe aussi des modules qui se chargent spécifiquement de cette fonction :
    - Storable
    - Tie::Persistent
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2010
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Euh... dans ce cas, il ne faut pas utiliser un formatage XML, mais utiliser Data:umper.
    Je fais cela très couramment.
    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
     
    use Data::Dumper;
    our $my_data;
     
    my $my_data_file = "my_data.pm";
     
    # si le fichier de donnée existe, le charger dans $my_data
    if (-f $my_data_file) {
      unless (my $return = do $my_data_file) {
        die "couldn't parse $my_data_file: $@\n" if $@;
        die "couldn't do $my_data_file: $!\n"    unless defined $return;
        die "couldn't run $my_data_file\n"       unless $return;
      }
    }
     
    ...
     
    # sauver $my_data
    open my $DATA_FILE, ">", $my_data_file or die "Can't open $my_data_file : $!";
    print {$DATA_FILE} Data::Dumper->Dump([$my_data], [qw(*my_data)]);
    print {$DATA_FILE} "1;";
    close $DATA_FILE;
    Indépendamment de Data:umper, il existe aussi des modules qui se chargent spécifiquement de cette fonction :
    - Storable
    - Tie:ersistent
    Merci beaucoup Philou vous êtes vraiment un champion du perl, j'ai essayé le module storable et l tout marche bien.
    Je vous remercie encore.

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/05/2010, 13h04
  2. [Linux]problème d'affectation d'une structure
    Par cimcim dans le forum Linux
    Réponses: 5
    Dernier message: 11/12/2006, 17h13
  3. probleme avec une "structure en arbre"
    Par kamouminator dans le forum C
    Réponses: 1
    Dernier message: 07/11/2006, 22h21
  4. [vbnet] problème de conversion dans une datagrid
    Par Jsh dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/09/2005, 12h40
  5. [xml]Conversion d'une structure xml en csv
    Par cchatel2000 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 01/08/2005, 16h00

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