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 -> Parser 2 niveaux


Sujet :

Modules Perl

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Par défaut XML::Simple -> Parser 2 niveaux
    Bonjour,

    apres de multiples recherches, je n'arrive pas a trouver une solution a mon probleme:

    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
     
    <?xml version="1.0" encoding="iso-8859-1" ?>
    <xml>
    	<file name="file1">
    		<groups>
    			<group>Groupe1</group>
    		</groups>
    		<segments>
    			<segment >Seg1</segment>
    			<segment >Seg2</segment>
    		</segments>
    	</file>
     
    	<file name="file2">
    		<groups>
    			<group>Group2</group>
    		</groups>
    		<segments>
    			<segment >Seg1</segment>
    			<segment >Seg2</segment>
    			<segment >Seg3</segment>
    		</segments>
    	</file>
    </xml>
    Je cherche donc à parser mon fichier xml afin d'obtenir à l'écran:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    File1
           Seg1
           Seg2
     
    File2
           Seg1
           Seg2 
           Seg3
    Voici ce que j'ai essaye de faire:

    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
     
    use XML::Simple;
    use Data::Dumper;
     
    # creation de l'object:
    my $xml = new XML::Simple;
     
    # On lit notre fichier xml
    my $data = $xml->XMLin("fichier.xml");
     
    #Je passe en revue chaque fichier (branche "file" dans le xml)
     
    foreach my $file_tab (@{$data->{file}}){
     
           print $file_tab->{name}."\n";
     
    	foreach my $segment_tab (@{$file_tab->{segments}->{segment}}){
     
    		print $segment_tab->{content}."\n";
     
    	}
     
    }
    j'ai donc essaye de mettre de boucle mais j'ai une erreur sur la deuxieme boucle

    Merci d'avance si vous avez une solution ou un exemple

    ++

  2. #2
    Expert confirmé
    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
    Par défaut
    C'est mieux de nous dire l'erreur pour qu'on puisse t'aider... Par ailleurs tu as mis "use Data::Dumper;" dans ton script, pour quoi faire si tu ne l'utilises pas ? Si tu l'avais fait, tu aurais rapidement abouti à ce script :
    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
     
    #! /usr/bin/perl
    use XML::Simple;
    use Data::Dumper;
     
    # creation de l'object:
    my $xml = new XML::Simple;
     
    # On lit notre fichier xml
    my $data = $xml->XMLin("fichier.xml", KeyAttr => [], ForceContent => 1);
     
    #Je passe en revue chaque fichier (branche "file" dans le xml)
    foreach my $file_tab (@{$data->{file}}){
     
           print $file_tab->{name}."\n";
     
        foreach my $segment_tab (@{$file_tab->{segments}->{segment}}){
     
            print "\t".$segment_tab->{content}."\n";
     
        }
     
    }
    --
    Jedaï

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Par défaut
    Bonjour,

    Merci pour cette réponse rapide, mais aussi pour le script qui marche tres bien avec ce type de fichier xml.

    Par contre je viens remarquer un nouveau probleme. En effet si je modifie le fichier xml, en y mettant par exemple qu'un seul "segment" dans la partie "File2" comme ceci:

    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
     
    <?xml version="1.0" encoding="iso-8859-1" ?>
    <xml>
    	<file name="file1">
    		<groups>
    			<group>Groupe1</group>
    		</groups>
    		<segments>
    			<segment >Seg1</segment>
    			<segment >Seg2</segment>
    		</segments>
    	</file>
     
    	<file name="file2">
    		<groups>
    			<group>Group2</group>
    		</groups>
    		<segments>
    			<segment >Seg1</segment>
    		</segments>
    	</file>
    </xml>
    J'ai ce message d'erreur sur la deuxieme boucle:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    file1
            Seg1
            Seg2
    file2
    Not an ARRAY reference at ./xml2.pl line 16
    Le probleme survient aussi si je n'ai qu'un "file" dans le fichier xml.

    S'il n'y a qu'un "segment" ou qu'un "file", ce n'est plus considéré comme un tableau....

    Je vais continuer à chercher mais si vous avez une idée

    Merci d'avance

    ++ Gpo

  4. #4
    Expert confirmé
    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
    Par défaut
    Lis un peu la doc de XML::Simple et tu verras que ce module a tendance à essayer de simplifier la structure à tout prix, dès qu'il le peut. On peut contrarier ce comportement pour avoir une structure un peu plus régulière. En l'occurence, il suffit de rajouter l'option ForceArray :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    my $data = $xml->XMLin("fichier.xml", KeyAttr => [], ForceContent => 1, ForceArray => [qw(file segment)]);
    --
    Jedaï

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 6
    Par défaut
    Merci bcq, la syntaxe "ForceArray => [qw(file segment)]" resoud parfaitement mon problème.

    ++ Gpo

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

Discussions similaires

  1. Parser flux xml avec balises sur plusieurs niveaux
    Par Freedolphin dans le forum XQUERY/SGBD
    Réponses: 3
    Dernier message: 19/09/2011, 15h39
  2. Problème XML::Simple & image::Magick
    Par rori dans le forum Modules
    Réponses: 5
    Dernier message: 17/05/2006, 17h02
  3. Problème avec XML::Simple
    Par ViRouF dans le forum Modules
    Réponses: 7
    Dernier message: 10/04/2006, 17h17
  4. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32
  5. [XML] recherche un parser cross platform : libXML2 ou Xerces ???
    Par baert dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 13/09/2005, 14h49

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