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 :

XML::Simple, Suppression de balises dans le fichier source


Sujet :

Modules Perl

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 25
    Points : 10
    Points
    10
    Par défaut XML::Simple, Suppression de balises dans le fichier source
    Bonjour,

    Je souhaite à partir d'un fichier xml source contenant de nombreuses balises, en supprimer certaines en fonction de leur contenu...
    Je m'explique :

    Voici une petite partie de la structure du mon fichier xml source que j'ai récupéré via le module xml::simple

    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
     
    $VAR1 = {
              'BODY' => {
                        'SLU' => {
                                 'TOTO' => {
                                              'XXXX' => 'xx'
                                           },
     
     
                                 'LIST' => {
                                             'RESULT' => [
                                                    {
                 |                                     'AAAAA' => {},
                 |                                     
                 |                                     'BBBBB' => {
                 |                                                '11111' => '00:00',
                 |                                                '22222' => {
                 |                                                         'BB' => 'bb',
                 |                                                         'BBB' => 'bbb'
                 |                                                       },
                 |                                                },
                 |                                                 
                 |                                      'CCCCC' => {
                 |                                                  '11111' => {
                 |                                                               'ddd' => {
                 |                                                                       'ee' => '00',
    'RESULT'1|                                                                       'ff' => {},
                 |                                                                      },
                 |                                                                      
                 |                                                              'eeee' => 'A/B',
                 |                                                               'fff' => {},
                 |                                                               }
                 |                                                               
                 |                                                   }
                 |                                    },
     
     
                                                      {
                 |                                     'AAAAA' => {},
                 |                                     'BBBBB' => {
                 |                                                '11111' => '0000',
    'RESULT'2|                                                '22222' => { ...
                 |                                                			
                 |                                                			}
                 |                                    ...
                 |                                		 ...
                 |                                    ...
                                                     ...
    'RESULT'x|                                    ...
                 |                                    
                                                     ]
     
                                           ...
    L'entête xml de mon fichier destination ne changera pas, jusqu'aux nombreuses balise <RESULT>, en effet, en fonction du contenu d'un élément présent dans une balise <RESULT>, je souhaite supprimer l'ensemble du contenu de la balise.

    Voici le code que j'ai commencé, j'arrive bien à interroger le contenu des sous balises présentes dans mes balises <RESULT>, mais je n'arrive pas à reconstruire un fichier xml avec la même structure.

    N'ayez pas peur du code, je tente de m'améliorer , je ne maitrise pas encore assez les tables de hashages

    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
     
    use XML::Simple;
     
    use Data::Dumper;
     
    open(OUT,"> test.txt") or die("Impossible d'ouvrir test.txt\n");
     
    @Tab = ();
     
    $xml = new XML::Simple;
     
    $ref = $xml->XMLin('test.xml');
     
    foreach $value	(@{$ref->{BODY}->{SLU}->{LIST}->{RESULT}})	{
     
    	$BBBBB = $value->{BBBBB};
     
    	$CCCCC = $value->{CCCCC};
     
     
    	#SI OK, je souhaite conserver la structure ('AAAAA','BBBBB','CCCCC')  #dans un mon futur fichier xml
    	if (($BBBBB->{22222}->{BB} eq "bb") && (($CCCCC->{11111}->{eeee}) eq "A/B"))		{  
     
    				push(@Tab,$value);
     
     
    	}
     
     
    }
     
     
    #Reconstruction d'un fichier xml avec ce qui m'interesse	
    $xml = new XML::Simple (NoAttr=>1, RootName=>'data');
     
    $data = $xml->XMLout(\@Tab);
     
    print Dumper($data);
    Merci beaucoup pour votre aide.

    CC

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Re,

    Je viens de décomposer chaque valeur de mon tableau @Tab comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    foreach $bloc(@Tab)	{
     
    			$$NEWTAB{keys %{$_}} = $bloc; #===> Decomposition du hash
     
     
    }
    Seulement lorsque je lance la commande :
    en dehors de ma boucle foreach, il ne me sort que le dernier élément. (ce qui est biensur logique (c'est une table de hashage))

    Comment pourrai je faire pour tout afficher d'un coup ?
    Et une fois ok, comment replacer le tout dans un fichier xml différent avec les entetes du fichier xml d'origine ?

    Merci,

    CC

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    J'ai avancé un peu.
    Un insérant chaque retour de ma boucle foreach dans un tableau @RETOUR, j'arrive maintenant à récupérer toutes les balises qui m'interesse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    foreach $bloc(@Tab)	{
     
        @RETOUR[$w] = $$NEWTAB{keys %{$_}} = $bloc; #===> Decomposition du hash
        $w++;
     
    }
    J'affiche ensuite la structure par la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print Dumper(\@RETOUR);
    Mon problème maintenant est de pouvoir créer un fichier XML avec la même entête que mon fichier d'origine, plus, les balises que je viens de récupérer dans @RETOUR ...

    Je ne sais pas si j'ai été clair

    Pourriez vous m'orienter , s'il vous plait.
    Vos remarques sont les bienvenues.

    Merci,

    CC

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Personnellement, à ta place je m'orienterais plus vers XML::Twig : XML::Simple c'est sympa pour les cas les plus simples de lecture de fichier XML, éventuellement pour modifier un tout petit peu le contenu texte... Mais pour faire des manipulations comme tu le souhaites, c'est la croix et la bannière pour obtenir ne serait-ce que quelque chose qui marche de temps en temps, et les résultats sont de toute façon fort fragiles.

    --
    Jedaï

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Merci du conseil, je vais regarder ce module.
    C'est un peu dommage car j'avancai doucement.

    Il ne me restait plus qu'a reconstruire le xml de sortie quitte à refaire un programme après.

    Je reste toujours preneur de solution pour le cas présent.

    CC

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Effectivement, ce module est plus simple à utiliser dans mon cas. Il m'a fallu une petite soirée pour réaliser ce que je souhaitais faire.

    Merci bien pour le conseil. Voici une partie du 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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    $twig= XML::Twig->new( twig_handlers => { RESULT => \&RESULT })->parsefile( "test.xml");
     
    $twig->print( \*OUT);
     
    close OUT;
     
     
     
     
    sub RESULT
    { 
     
    ( $twig, $RESULT)= @_;
     
    $duration= $RESULT->first_child('BBBBB')->field('22222');
     
     ($hour,$min,$sec,$ms) = split(/:/,$duration);
     
     
      if ((($min > 20) && ($hour == 00)) || ($hour > 00))	{
     
    		 #je conserve la balise
    		 print "OK\n";	
       }
     
       else {
     
     
              if ($RESULT->first_child('CCCCC')) {
    	  $content= $RESULT->first_child('CCCCC')->first_child('11111')->att('eeeee') ;
     
              if ($content ne "A/B")	{
    	            #je conserve la balise
    		    print "OK\n";	
    	  }
     
    	  else {
     
                     #Je purge
    		 $RESULT->delete;
    	     }
            }
     
    	else {
    	   #Je purge
    	   $RESULT->delete;
    	  }
     
       }
     
    }
    Je suis toujours preneur sur les remarques concernants la propreté du code...

    CC

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/05/2009, 08h25
  2. Récupérer plusieurs balises dans un fichier XML
    Par sandddy dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2009, 14h48
  3. tester la présence de balises dans le fichier xml
    Par Balbuzard dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 29/08/2008, 15h11
  4. Pb de balises dans un fichier XML
    Par gaggy dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 20/10/2007, 14h03

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