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 :

Traitement d'une structure XML qui change


Sujet :

Modules Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 43
    Points : 26
    Points
    26
    Par défaut Traitement d'une structure XML qui change
    Bonjour,

    J'utilise un script PERL et son module XML::Simple pour parser un fichier XML et récupérer le contenu de différents tags.
    Mon probléme est que la structure de ce fichier xml n'est pas la même tout le long.

    par exemple pour la majorité des cas la structure xml se présente comme ceci:
    Code xml : 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
     
    <partner name="titi">
       <start>09/10/2006 23:24:03</start>
       <end>09/10/2006 23:52:19</end>
       <duration>00:28:15</duration>
       <files>
          <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
       </files>
    </partner>
    <partner name="tata">
       <start>09/10/2006 23:24:03</start>
       <end>09/10/2006 23:52:19</end>
       <duration>00:28:15</duration>
       <files>
          <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
       </files>
    </partner>

    Pour ce type de traitement le probleme ne se pose pas et je récupere le tag <datelastupdate> comme ceci:

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach $e (@{$data->{partner}}) {
       datelastupdate=$e->{files}->{file}->{datelastupdate};
    }

    Par contre quand la structure est modifiée (quand il y a plusieurs tag <file>d'affilé)je ne vois pas comment récupérer ce tag <datelastupdate> à l'intérieur des balises <file>.
    Code xml : 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
    <partner name="titi">
       <start>09/10/2006 23:24:03</start>
       <end>09/10/2006 23:52:19</end>
       <duration>00:28:15</duration>
       <files>
          <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
           <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
           <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
       </files>
    </partner>
    <partner name="tata">
       <start>09/10/2006 23:24:03</start>
       <end>09/10/2006 23:52:19</end>
       <duration>00:28:15</duration>
       <files>
          <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
       </files>
    </partner>

    Si vous pouvez m'orienter un peu c'est top et demandez moi si je me suis mal expliqué.

    Merci d'avance pour votre aide.

  2. #2
    Membre du Club Avatar de goblin
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 53
    Points
    53
    Par défaut
    Voila la solution a ton problème

    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
    #!/usr/bin/perl -w
    use XML::Simple;
     
    my $i = ' <root>
    <partner name="titi">
       <start>09/10/2006 23:24:03</start>
       <end>09/10/2006 23:52:19</end>
       <duration>00:28:15</duration>
       <files>
          <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
           <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
           <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
       </files>
    </partner>
    <partner name="tata">
       <start>09/10/2006 23:24:03</start>
       <end>09/10/2006 23:52:19</end>
       <duration>00:28:15</duration>
       <files>
          <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
       </files>
    </partner></root>';
     
    my $ref = new XML::Simple;
    my $o = $ref->XMLin($i);
       $o = $o->{'partner'};
     
    # On parcourt chaque clef du hash
    foreach my $key (keys %$o)
    {
      # Si la clef files->file est un tableau 
      if ( ref($o->{$key}{files}{file}) eq "ARRAY" )
      {
        # On met la référence dans une autre variable
         my $u = $o->{$key}{files}{file};
        print "\nNous somme un tableau\n";
       # On parcourt chaque élément du tableau qui est comme ceci [{ clef => valeur }...]
        foreach my $t ( @$u)
        {
            print "\n$t->{datelastupdate}\n"; # enfin il suffit de récupérer le contenue de chaun dans hash du tableau
        }
      }
       else
      {
        print "\nJe suis unique\n";
        print "\n$o->{$key}{files}{file}\n";
     }
    }


  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    salut goblin, tout d'abord merci pour ta réponse.
    J'ai testé la solution que tu proposes, mais je n'accéde toujours pas à mon tag datelastupdate quand LES <FILE></FILE> se répète plusieurs fois.
    Le programme n'arrive surement pas à voir si la clef files->file est un tableau.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    J'ai fais quelques vérifications et le code fonctionne finalement trés bien avec le morceau de code Xml que j'ai posté. Mais vu que ma structure est un peu différente ça pose problème. Je vais aller chercher un peu plus loin avant de vous embêter un peu plus... :-)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    voici ma structure quand je fais un Dumper sur mon fichier xml. je m'aperçois qu'il y a un niveau supplémentaire aprés la clé "FILE", un nom de fichier.

    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
    'toto' => {
                            'tag1' => 'Mon Oct 09 23:35:21 CEST 2006',
                            'tag2' => '',
                            'tag3' => 'Mon Oct 09 23:28:15 CEST 2006',
                            'files' => {
                             'file' => {
                                        'fichier1.txt' => {
    'datelastupdate' => 'Mon Oct 09 22:37:00 CEST 2006'                                                                                                                                  
                                           },
                                         'fichier2.txt' => {
    'datelastupdate' => 'Mon Oct 09 22:37:00 CEST 2006',
     
                                           },
                                         }
                                  }
    }
    Comment puis-je procéder pour récupérer le contenu de mon tag 'datelatupdate' dans ce cas là? sachant que le nom des fichiers vient d'un tag name situé dans l'arborescence de <FILE> comme ceci:


    <files>
    <file>
    <name>fichier1.txt</name>
    <datelastupdate>Mon Oct 09 22:37:00 CEST 2006</datelastupdate>
    </file>
    <file>
    <name>fichier2.txt</name>
    <datelastupdate>Mon Oct 09 22:38:00 CEST 2006</datelastupdate>
    </file>


    Merci d'avance pour votre aide!

  6. #6
    Membre du Club Avatar de goblin
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 62
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par moook
    voici ma structure quand je fais un Dumper sur mon fichier xml. je m'aperçois qu'il y a un niveau supplémentaire aprés la clé "FILE", un nom de fichier.

    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
    'toto' => {
                            'tag1' => 'Mon Oct 09 23:35:21 CEST 2006',
                            'tag2' => '',
                            'tag3' => 'Mon Oct 09 23:28:15 CEST 2006',
                            'files' => {
                             'file' => {
                                        'fichier1.txt' => {
    'datelastupdate' => 'Mon Oct 09 22:37:00 CEST 2006'                                                                                                                                  
                                           },
                                         'fichier2.txt' => {
    'datelastupdate' => 'Mon Oct 09 22:37:00 CEST 2006',
     
                                           },
                                         }
                                  }
    }
    Comment puis-je procéder pour récupérer le contenu de mon tag 'datelatupdate' dans ce cas là? sachant que le nom des fichiers vient d'un tag name situé dans l'arborescence de <FILE> comme ceci:


    <files>
    <file>
    <name>fichier1.txt</name>
    <datelastupdate>Mon Oct 09 22:37:00 CEST 2006</datelastupdate>
    </file>
    <file>
    <name>fichier2.txt</name>
    <datelastupdate>Mon Oct 09 22:38:00 CEST 2006</datelastupdate>
    </file>


    Merci d'avance pour votre aide!


    Ta petite modif change un peu le code que voila


    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
    #!/usr/bin/perl -w
    use XML::Simple;
    use Data::Dumper;
     
    my $i = ' <root>
    <partner name="titi">
       <start>09/10/2006 23:24:03</start>
       <end>09/10/2006 23:52:19</end>
       <duration>00:28:15</duration>
       <files>
         <file>
           <name>fichier1.txt</name>
           <datelastupdate>Mon Oct 09 22:37:00 CEST 2006</datelastupdate>
         </file>
         <file>
           <name>fichier2.txt</name>
           <datelastupdate>Mon Oct 09 22:38:00 CEST 2006</datelastupdate>
        </file>
       </files>
    </partner>
    <partner name="tata">
       <start>09/10/2006 23:24:03</start>
       <end>09/10/2006 23:52:19</end>
       <duration>00:28:15</duration>
       <files>
          <file>
             <datelastupdate>10/10/2006 00:00:00</datelastupdate>
          </file>
       </files>
    </partner></root>';
     
     
     
    my $ref = new XML::Simple;
    my $o = $ref->XMLin($i);
       $o = $o->{'partner'};
     
    # On parcourt chaque clef du hash
    foreach my $key (keys %$o)
    {
      # Si la clef files->file est un tableau 
      if ( ref($o->{$key}{files}{file}) eq "HASH" )
      {
        # On met la référence dans une autre variable
         my $u = $o->{$key}{files}{file};
     
        # On parcourt chaque élément du hash
        foreach my $t ( keys %$u )
        {
          if ( $t eq "datelastupdate" )
          {
            print "\n$u->{$t}\n";
          }
            else
          {
            print "\n$u->{$t}{datelastupdate}\n";
          }
        }
      }
    }

    voili voulo

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 43
    Points : 26
    Points
    26
    Par défaut
    merci beaucoup, ton code m'a bien aidé!
    trés bonne journée à vous tous.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 28/10/2013, 20h09
  2. [Structure] Aide sur une structure XML (et le vocabulaire associé)
    Par projetdk40 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 14/02/2007, 10h38
  3. Recherche dans une structure XML::Simple
    Par nicolargo dans le forum Modules
    Réponses: 1
    Dernier message: 04/09/2006, 19h17
  4. [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
  5. Enlver un noeud dans une structure XML
    Par Sharingan dans le forum ASP
    Réponses: 4
    Dernier message: 20/12/2004, 08h08

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