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] Comment parser ?


Sujet :

Modules Perl

  1. #1
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut [XML] Comment parser ?
    Bonjour

    J'avoue que le titre est vague, je vais tâcher de vous expliquer. Je dois récupérer certaines infos à partir de fichiers XML. La structure de ce document est telle que :
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <protein_summary execution_date="Thu Jul 15 10:55:53 2004" program_version="ProteinProphet.pl v2.0 AKeller August 15, 2003">
    <protein_group group_number="1" probability="1.00">
          <protein protein_name="UniRef100_Q8IUB0" n_indistinguishable_proteins="10" probability="1.00" percent_coverage="3.2" unique_stripped_peptides="LPLQDVYK" group_sibling_id="a" total_number_peptides="1">
             <annotation protein_description="CTCL tumor antigen [Homo sapiens]"/>
             <indistinguishable_protein protein_name="UniRef100_Q9H2I7">
                <annotation protein_description="EF1a-like protein [Homo sapiens]"/>         </indistinguishable_protein>
             <indistinguishable_protein protein_name="UniRef100_Q96RE1">
                <annotation protein_description="Translation elongation factor 1 alpha 1-like 14 [Homo sapiens]"/>         </indistinguishable_protein>
             <indistinguishable_protein protein_name="UniRef100_Q8TBL1">
                <annotation protein_description="Hypothetical protein [Homo sapiens]"/>         </indistinguishable_protein>
             <indistinguishable_protein protein_name="UniRef100_Q16577">
                <annotation protein_description="Oncogene [Homo sapiens]"/>         </indistinguishable_protein>
             <indistinguishable_protein protein_name="UniRef100_Q96CD8">
                <annotation protein_description="Hypothetical protein [Homo sapiens]"/>         </indistinguishable_protein>
             <indistinguishable_protein protein_name="UniRef100_Q9NZS6">
                <annotation protein_description="Glucocorticoid receptor AF-1 specific elongation factor [Homo sapiens]"/>         </indistinguishable_protein>
             <indistinguishable_protein protein_name="UniRef100_Q96C29">
                <annotation protein_description="Hypothetical protein [Homo sapiens]"/>         </indistinguishable_protein>
             <indistinguishable_protein protein_name="UniRef100_Q05639">
                <annotation protein_description="Elongation factor 1-alpha 2 [Homo sapiens]"/>         </indistinguishable_protein>
             <indistinguishable_protein protein_name="UniRef100_P04720">
                <annotation protein_description="Elongation factor 1-alpha 1 [Homo sapiens]"/>         </indistinguishable_protein>
             <peptide peptide_sequence="LPLQDVYK" charge="2" initial_probability="0.96" nsp_adjusted_probability="1.00" weight="1.00" is_nondegenerate_evidence="Y" n_tryptic_termini="2" n_sibling_peptides="0.00" n_sibling_peptides_bin="0" n_instances="1" is_contributing_evidence="Y">
             </peptide>
          </protein>
    </protein_group>
    </protein_summary>
    Ce qui m'intéresse plus particluièrement, c'est de récupérer les attributs protein_name et protein_description.
    J'ai regardé un peu au niveau des parseurs, mais je dois bien avouer que je débute totalement . Un exemple de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    use XML::Parser;
     
    # initialize parser and read the file
    $parser = new XML::Parser( Style => 'Tree' );
    my $tree = $parser->parsefile( "./short.xml" );
     
    # serialize the structure
    #use Data::Dumper;
    #print Dumper( $tree );
     
    print "".$tree->{ protein_summary }->{ protein_group }->{ protein=>"protein_name" }."\n";
    Mais bon, ce code ne fonctionne pas. Pouvez-vous m'aider à vaincre XML ?

    @ ++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  2. #2
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Bon, j'ai changé ma stratégie. Je passe par les handlers plutôt que par les arbres (GLDavid, t'es pas écolo !) :
    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 XML::Parser;
     
    # initialize the parser
    my $parser = XML::Parser->new( Handlers => 
                                         {
                                          Start=>\&handle_start,
                                          End=>\&handle_end,
                                         });
    $parser->parsefile( "./short.xml" );
     
    my @stack; 
    my @tab;
     
    # process a start-of-element event: print message about element
    #
    sub handle_start {
        my( $expat, $protein, %attrs ) = @_;
     
        # ask the expat object about our position
        my $line = $expat->current_line;
     
        # remember this element and its starting position by pushing a
        # little hash onto the element stack
        push( @stack, { protein=>$protein, line=>$line });
     
        if( %attrs ) {
            while( my( $key, $value ) = each( %attrs )) {
                #print "\t$key => $value\n";
                if ($key eq "protein_name") {
                	printf("%s\t%s\n", $key, $value);
                }
            }
        }
     
    }
     
    # process an end-of-element event
    #
    sub handle_end {
     
    }
    Maintenant, je vais tâcer de combiner les attributs protein_name et protein_description et je pense que j'y suis.
    Restera plus qu'après d'écrire ça dans un fichier txt. Mais ça, c'est une autre histoire !

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  3. #3
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Ok, :trouve: . Je suis arrivé à un résultat satisfaisant :
    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
     
    use XML::Parser;
     
    # initialize the parser
    my $parser = XML::Parser->new( Handlers => 
    {
    Start=>\&handle_start,
    End=>\&handle_end,
    });
    $parser->parsefile( "./short.xml" );
     
    my @stack;
     
    sub handle_start {
    	my( $expat, $protein, %attrs ) = @_;
    	push( @stack, { protein=>$protein});
    	if( %attrs ) {
    		while( my( $key, $value ) = each( %attrs )) {
    		if ($key eq "protein_name") {
    			my($name) = $value;
    			print "$value\t";
    			}
    		if ($key eq "protein_description") {
    			$desc = $value;
    			printf("%s\n", $desc);
    			}
    		}
    	}
    }
     
    sub handle_end {
       #Do nothing ! 
    }
    Maintenant, place à l'écriture du fichier résultat .
    Et dire que je crachais sur Perl il y a encore quelques mois !!!
    Mea Culpa !!

    @ ++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Cher moi-même !

    J'ai finalement trouvé la solution de tous tes embarras. Comme tu le vois, c'était finalement pas si compliqué que ça, il suffisait juste de se donner la peine de réfléchir aux codes déjà proposés et de les adapter.
    La soluce :
    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
     
    use XML::Parser;
     
    # initialize the parser
    my $parser = XML::Parser->new( Handlers => 
    {
    Start=>\&handle_start,
    End=>\&handle_end,
    });
    $parser->parsefile( "./interact-prot.xml" );
     
    my @stack;
     
    sub handle_start {
    	my($name, $desc);
    	my( $expat, $protein, %attrs ) = @_;
    	push( @stack, { protein=>$protein});
    	if( %attrs ) {
    		while( my( $key, $value ) = each( %attrs )) {
    		if ($key eq "protein_name") {
    			$name = $value;
    			open FILE, ">>./Result.txt" or die "Peut pas ouvrir Result.txt !!";
    			print FILE "$name\t";
    			}
    		if ($key eq "protein_description") {
    			$desc = $value;
    			open FILE, ">>./Result.txt" or die "Peut pas ouvrir Result.txt !!";
    			print FILE "$desc\n";
    			}
    		}
    	}
    }
     
    sub handle_end {
       #Do nothing ! 
    }
    Maintenant, à toi d'en faire ce qu'il te plaira !

    @ ++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  5. #5
    Membre du Club Avatar de Batou
    Inscrit en
    Mars 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 71
    Points : 62
    Points
    62
    Par défaut $expat, $protein et %attrs
    yo gldavid,

    la vache, t'as lair vachement fort en perl dis-donc : t'as repondu a ton propre mail, avec la solution moins de 1:30 apres avoir poste la question... Trop fort !

    Bon, en ce qui me concerne, je dois faire a peu pres la mm chose en html.

    Pour ton message, je ne comprends pas ce que sont $expat, $protein et %attrs

    Pourrais tu stp me fournir une explication ?

    a plus
    batou
    "It has to start somewhere, It has to start sometime.
    What better place than here, what better time than now?
    " [RATM]

  6. #6
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Ouahhh !! On parle d'un vieux sujet !! A l'époque j'étais québecois !
    En fait, le fichier xml provient de programmes de validation en protéomique que je parsais pour ensuite insérer les données les plus pertinentes dans un SGBDR. Mais d'abord, de les récupérer dans un fichier.
    Le temps de repotasser tout ça et je te tiens au courant sur l'algo.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  7. #7
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    En fait, je vais te passer la documentation sur laquelle je me suis inspiré pour réaliser ceci :
    1) http://search.cpan.org/~msergeant/XML-Parser-2.34/Parser.pm
    2) http://www.xml.com/pub/a/98/09/xml-perl.html
    Le 2ème lien est important pour comprendre les variables que j'ai utilisé (bien que $expat, je m,en sers pas finalement).
    J'espère que ça t'aidera.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  8. #8
    Membre du Club Avatar de Batou
    Inscrit en
    Mars 2004
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 71
    Points : 62
    Points
    62
    Par défaut XML
    Bonjour, re-bonjour,

    ok pour les liens, je vais les conserver.
    J'ai resolu mon probleme, merci pour ton aide !

    Sinon, petite remarque :
    les boutons [delestage] et [resolu] ne s'affiche plus dans mon navigateur... (mozilla firefox)
    par contre, y a toujours les zones actives, je peux donc cliquer sur le blanc a la place.
    C'est normal ca ?

    batou, amoureux du lieutenant kuzanagi
    "It has to start somewhere, It has to start sometime.
    What better place than here, what better time than now?
    " [RATM]

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

Discussions similaires

  1. [XML] [SAX] Comment Parser du XML
    Par Masterlud dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 17/04/2007, 20h26
  2. [DOM4J] Comment parser un fichier xml avec dom4j
    Par taouja dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 12/04/2007, 07h47
  3. [C#] Comment parser un flux XML ?
    Par Dunkan dans le forum C#
    Réponses: 1
    Dernier message: 22/09/2006, 13h32
  4. [XML] Comment parser ce fichier XML avec java !
    Par jlassira dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 13/03/2006, 12h56
  5. [DOM XML] Comment parser du XML avec une version 4.3 ?
    Par ouioui2000 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 18/10/2005, 15h52

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