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 :

pb xml::twig


Sujet :

Modules Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Points : 11
    Points
    11
    Par défaut pb xml::twig
    Bonjour,

    débutant en perl (niveau zéro de chez zéro même ), et devant effectuer de toute urgence une correction sur un exe en perl, je me tourne vers vous tous.

    J'explique : je dois récupérer des infos d'un fichier xml (balises ou attributs).
    Pour cela j'ai développé un petit log de test qui marche à merveille.
    Le problème c'est pour incorporer mon code à celui déjà existant, car il faut que je le mette dans une fonction, qui retourne au final une hashtable...

    Dans cette hashtable, on aura :
    [code balise n°1] contenu balise n°1; contenu attribut n°1
    [code balise n°2] contenu balise n°2; contenu attribut n°2
    etc...

    j'utilise xml::twig car cela me permet de trouver les balises qui peuvent être à des niveaux différents d'un fichier à l'autre, mais dans l'absolu, l'information est toujours présente dans les fichiers.

    Donc, quand j'incorpore mon bout de code (qui ne faisait qu'afficher à l'écran les infos), dans le programme à débogger, je n'arrive pas à faire suivre les données.
    Voici le code:
    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
     
    sub getpath{
    	#retourne la hashMap avec le titre N° et le nom de fichier
    	my ($goodFileXML, $Folder)=@_;
    	my $ddate = ""; #passer la date de revision en parametre
    	my $refHash = extractTitle($goodFileXML, \$ddate, $Folder);
    	return $refHash;
    }
     
    sub extractTitle{
    	my ($ficName, $refDate, $Folder) = @_;
    	#créer une map avec le titre et les noms des fichiers
    	my %hashTitleFic;
     
    # Utilisation des handlers
    	my $twig = new XML::Twig( Twig_handlers => { 'du-sol' => \&dusol, }, );
    	# creation d'un objet twig
    	$twig->parsefile($ficName);
     
            my ($refh) = \%hashTitleFic;
     
    	return $refh; #retourner la référence sur la hashmap
    }
     
     
    sub dusol {
    	my ($twig, $TwigSol, %hashTitleFic, $key) = @_;
            my $value = "";
     
    	$value= $TwigSol->field('title');
    	$key= $TwigSol->att('code');
    	foreach my $TwigRef ( $TwigSol->children('sol-mdata-ref') ) {
    		$value=$value.";".$TwigRef->att('href');
            }
    	$hashTitleFic{$key} = $value;
     
    	# vide de la memoire le contenu de la balise du-sol
           	#$twig->purge;
    	return %hashTitleFic;
    }
    ps : mon code qui marche début aux Handlers....
    et ce que je souhaite faire suivre est %hashTitleFic

    j'espère avoir été assez claire dans mon explication.

    Pouvez-vous m'aider?
    D'avance merci pour vos réponses et votre aide.

    Cordialement,
    Pirotes31.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Personne pour m'aider...?

  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 faudrait donner un exemple du contenu du fichier XML et du résultat attendu.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Points : 11
    Points
    11
    Par défaut pb xml::twig
    Merci pour votre réponse.

    Voici un exemple de fichier xml de départ :

    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
     
    <produit id="1">
      <titre>Ici le titre du produit</titre>
      <ref href="./test.xml" />
      <niv id="1">
        <titreniv>Niveau 1</titreniv>
        <niv id="2">
          <titreniv>Niveau 2</titreniv>
          <groupe code="grp1">
            <titregrp>Groupe 1</titregrp>
            <du-sol code="001">
              <title>titre solution</title>
              <sol-cont href="./grp/nom1.xml" />
              <sol-mdata-ref href="./sgrp/nom1-data.xml" />
            </du-sol>
          </groupe>
        </niv>
      </niv>
    </produit>
    Sachant qu'il peut y avoir plus de 2 <niv> d'un fichier à l'autre.

    On veut obtenir ceci :
    hastable(001)="titre solution";"./sgrp/nom1-data.xml"

    En espérant avoir été assez précise.

    Merci pour votre aide et vos réponses.

    Cordialement,

    Pirotes31

  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
    Peux tu nous mettre un code perl fonctionnel histoire que l'on puisse juste faire un copier coller et tester pour voir ce que te donne ton code actuel. Et après on pourra essayer de le modifier.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    ok, j'essaie ça cet aprèm car c'est un code "pro".. et il faut que je "taille".

    encore merci.

    Voici le code complet :

    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
     
    #!/usr/bin/perl -w
    use strict;
    use locale;
    use XML::Simple;
    use Data::Dumper;
    use XML::Twig;
     
     
    # Fonctions	
     
    #-----------------------------------------------------------
    # On liste les path de chaque fichier *.xml dans une hashFile
    #-----------------------------------------------------------
    sub getpath{
    	#retourne la hashMap avec le titre N° et le nom de fichier
    	my ($goodFileXML, $Folder)=@_;
    	my $ddate = ""; #passer la date de revision en parametre
    	my $refHash = extractTitle($goodFileXML, \$ddate, $Folder);
    	return $refHash;
    }
     
    sub extractTitle{
    	my ($ficName, $refDate, $Folder) = @_;
    	#créer une map avec le titre et les noms des fichiers
    	my %hashTitleFic;
     
    # Utilisation des handlers
    	my $twig = new XML::Twig( Twig_handlers => { 'du-sol' => \&dusol, }, );
    	# creation d'un objet twig
    	$twig->parsefile($ficName);
     
            my ($refh) = \%hashTitleFic;
     
    	return $refh; #retourner la référence sur la hashmap
    }
     
     
    sub dusol {
    	my ($twig, $TwigSol, %hashTitleFic, $key) = @_;
            my $value = "";
     
    	$value= $TwigSol->field('title');
    	$key= $TwigSol->att('code');
    	foreach my $TwigRef ( $TwigSol->children('sol-mdata-ref') ) {
    		$value=$value.";".$TwigRef->att('href');
            }
    	$hashTitleFic{$key} = $value;
     
    	# vide de la memoire le contenu de la balise du-sol
           	#$twig->purge;
    	return %hashTitleFic;
    }
     
     
    #-----------------------------------------------------------
    # 					MAIN
    #-----------------------------------------------------------
     
    my $goodFileXML="c:\\test\\Fichiers\\GoodFile.xml";
    my $Folder="c:\\test\\Fichiers";
    #Recuperer la liste des path des fichiers dans une hashtable
    my %hashFile;
    my $refhashFile;
    $refhashFile=getpath($goodFileXML, $Folder);
    %hashFile=%$refhashFile;
     
    print "FIN\n\n";
    Je dois respecter cette organisation.

    Encore merci pour votre aide.

    Pirotes31.

  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
    Voilà, tu peux lire le code pour le comprendre. J'ai crée le hash de façon global et je le remplie dans toutes les procédures.

    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
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    use Data::Dumper;
    use XML::Twig;
     
    #-----------------------------------------------------------
    #                     MAIN
    #-----------------------------------------------------------
     
    my $goodFileXML = "c:/test/Fichiers/GoodFile.xml";
    my $Folder      = "c:/test/Fichiers";
     
    #Recuperer la liste des path des fichiers dans une hashtable
    my %hashFile;
    getpath( $goodFileXML, $Folder );
     
    foreach my $code ( keys %hashFile ) {
      print "Code : $code\n";
      print "Valeur : $hashFile{$code}\n";
      print "====\n";
    }
     
    print "FIN\n\n";
     
    # Fonctions
     
    #-----------------------------------------------------------
    # On liste les path de chaque fichier *.xml dans une hashFile
    #-----------------------------------------------------------
    sub getpath {
     
      #retourne la hashMap avec le titre N° et le nom de fichier
      my ( $goodFileXML, $Folder ) = @_;
      my $ddate = "";                                                 #passer la date de revision en parametre
      my $refHash = extractTitle( $goodFileXML, \$ddate, $Folder );
      return $refHash;
    }
     
    sub extractTitle {
      my ( $ficName, $refDate, $Folder ) = @_;
      %hashFile = ();
     
      # Utilisation des handlers
      my $twig = new XML::Twig( Twig_handlers => { 'du-sol' => \&dusol, }, );
     
      # creation d'un objet twig
      $twig->parsefile($ficName);
     
      return;    #retourner la référence sur la hashmap
    }
     
    sub dusol {
      my ( $twig, $TwigSol ) = @_;
     
      my $title = $TwigSol->field('title');
      my $code  = $TwigSol->att('code');
      my $href;
      foreach my $TwigRef ( $TwigSol->children('sol-mdata-ref') ) {
        $href .= $TwigRef->att('href');
      }
      $hashFile{$code} = $title . ';' . $href;
     
      # vide de la memoire le contenu de la balise du-sol
      #$twig->purge;
      return;
    }

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    grand merci pour ta réponse.
    J'ai essayé de comprendre le code.
    Le programme tourne parfaitement quand il est "tout seul".
    Par contre quand j'essaie de l'incorporer à mon programme ça ne marche pas...
    Je m'explique dans le code:

    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
     
    #-----------------------------------------------------------
    #                     MAIN
    #-----------------------------------------------------------
     
    my %hashFile;
    my %refHashFile;
    my $refHashFile;
     
    $refHashFile=getpath($goodFileXML, $Folder);
    foreach my $code ( keys %hashFile ) {
      print "Code : $code\n";
      print "Valeur : $hashFile{$code}\n";
      print "====\n";
    }
    %hashFile=%$refHashFile;
    print "\n FOLDER=$Folder\n";
    Or quand je fais cela, autant le détail est affiché, autant le %HashFile est en erreur : "can't use an undefined value as HASH reference at line x".

    Je ne comprends pas non plus ce que signifie "%$" dans %srefHashFile...

    J'ai un peu de mal avec les hashtables... où puis-je trouver un tutoriel "simple" à ce sujet?

    Encore un grand merci d'avance pour vos réponses.

    Pirotes31.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Points : 11
    Points
    11
    Par défaut
    plus de réponse...?

  10. #10
    Mr6
    Mr6 est déconnecté
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Septembre 2004
    Messages
    607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2004
    Messages : 607
    Points : 794
    Points
    794
    Par défaut
    Citation Envoyé par Pirotes31 Voir le message
    Or quand je fais cela, autant le détail est affiché, autant le %HashFile est en erreur : "can't use an undefined value as HASH reference at line x".

    Je ne comprends pas non plus ce que signifie "%$" dans %srefHashFile...

    J'ai un peu de mal avec les hashtables... où puis-je trouver un tutoriel "simple" à ce sujet?
    Ca veut dire qu'à la ligne x tu as une variable non valorisée (undef) sur laquelle tu tentes de travailler, par exemple utiliser $refHashFile alors que le hash est vide (ya quoi comme code à la ligne x ?).
    $refHashFile est une référence à ton tableau associatif. Le fait d'écrire %abc = %$def permet de créer un tableau associatif %abc qui va contenir le tableau associatif auquel $def fait référence. C'est ce qu'on appelle le déréférencement.
    Pour les docs/tutos/etc je pense que la FAQ et les cours Perl devrait d'aider

    @+
    Mr6

  11. #11
    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
    Tu ne te base plus sur le code que je t'ai filé avec des déclarations de variables plus globales, forcément ça ne fonctionne plus. Essaye de comprendre le code.

Discussions similaires

  1. [XML::Twig] l écriture d un tutorial
    Par ellgafsi dans le forum Modules
    Réponses: 1
    Dernier message: 06/05/2009, 14h51
  2. [XML::Twig] créer une balise
    Par ellgafsi dans le forum Modules
    Réponses: 1
    Dernier message: 30/04/2009, 09h29
  3. XML::Twig et caracteres incorrectes
    Par ellgafsi dans le forum Modules
    Réponses: 12
    Dernier message: 26/03/2009, 15h55
  4. problème "require" XML::Twig.
    Par Dimension_N dans le forum Modules
    Réponses: 5
    Dernier message: 27/02/2009, 02h33
  5. [XML::Twig] Commentaires dans le fichier XML réécrit
    Par knarf87 dans le forum Modules
    Réponses: 2
    Dernier message: 07/05/2008, 09h24

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