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] Parser selon des noeuds enfants


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] Parser selon des noeuds enfants
    Bonjour à vous !

    Voici mon problème. Voici un bout de code d'un fichier XML que je dois parser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <protein protein_name="IPI:IPI00026195.1" n_indistinguishable_proteins="7" probability="0.94" percent_coverage="11.4" unique_stripped_peptides="FSGSGSGTDFTLK" group_sibling_id="a" total_number_peptides="1">
             <annotation protein_description="Ig"/>
             <indistinguishable_protein protein_name="IPI:IPI">
                <annotation protein_description="IPI:IPI"/>         </indistinguishable_protein>
             <indistinguishable_protein protein_name="IPI:IPI00026175.1">
                <annotation protein_description="Ig"/>         </indistinguishable_protein>
    Oui, je suis sûr que vous voyez déjà ma question : je souhaite récupérer la valeur de l'attribut protein_name dans la balise annotation en fonction du noeud parent c'est à dire en fonction des balises protein ou indistinguishable_protein.
    Voici un bout de code de comment je récupère certaines données :
    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
     
    sub handle_start {
       my(@stack);
       my($name, $desc, $val, $sequence, $an);
       my( $expat, $protein, %attrs ) = @_;
       push( @stack, { protein_group=>$protein});
       if( %attrs ) {
            foreach my $key( keys %attrs ) {
                if ($key eq "group_number") {
                    $gn = $attrs{$key};
                    my($dbh) = DBI->connect("DBI:mysql:database=proteinprophet;host=localhost", 
                            "proteo", 
                            "kimduy",
                            {'RaiseError' => 1}
                    );
       				my($query) = "insert into groupe values ('$gn', '$NOM');";
       				my($sth) = $dbh->do($query);
                }
                elsif ($key eq "protein_name" and $protein eq 'protein') {
                    $name = $attrs{$key};
                    $an = $name;
                    my($dbh) = DBI->connect("DBI:mysql:database=proteinprophet;host=localhost", 
                            "proteo", 
                            "kimduy",
                            {'RaiseError' => 1}
                    );
                    my($query) = "insert into proteine (NomDossier, NumGroupe, AccessNumber) values ('$NOM', '$gn', '$name');";
       				 my($sth) = $dbh->do($query);
                }
    }
    Quelqu'un pourrait-il m'aider à améliorer mon parsing ?

    Merci d'avance !

    @++

    PS : regardez Alien le tout premier, meilleur film à frissons de tout l'Univers !!!
    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
    Membre actif
    Avatar de Choupi
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 223
    Points : 235
    Points
    235
    Par défaut
    Hello,

    Dans le module XML:arser, il y a un style Tree, je ne suis pas sur que cela puisse t'aider, en tout cas il construit un arbre ou chaque noeud correspond à un couple de Tag.

    C'est peut etre une piste à suivre.
    MacOS 10.5 / Ubuntu / C / Python / R
    Pensez au tag résolu

  3. #3
    Membre du Club
    Inscrit en
    Août 2004
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 50
    Points : 60
    Points
    60
    Par défaut
    Si ton objectif est de verser l'info XML en tableaux MySQL, peut-être, il vaut mieux ne pas du tout parser l'XML. Ton problème a une solution en pur XSLT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <xsl:template match="@group_number">
    	insert into groupe values ('<xsl:value-of select="." />', '$NOM');
    <xsl:template>
     
    <xsl:template match="protein">
    	insert into proteine (NomDossier, NumGroupe, AccessNumber) values ('$NOM', '<xsl:value-of select="../@group_number" />', '<xsl:value-of select="@protein_name" />');
    <xsl:template>
    En tout cas je conceillerrais de transformer d'abord XML en quelque texte (par exemple, en CSV).

  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
    Je remet à jour ce thread car il n'est pas résolu.
    Pour mémoire, je dispose mettons d'un fichier XML suivant :
    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
     
    <?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 que je veux, c'est rassembler certains datas importants de ce fichier et, pour le moment, les écrire dans un fichier. Voici mon 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
     
    my $file = 'short.xml';
    my $tree = XML::TreeBuilder->new();
     
    $tree->parse_file($file);
     
    foreach my $balise ($tree->find_by_tag_name('protein_group')){
        open FILE, ">>Results.txt" or die "Peut pas ouvrir Result.txt !!";
        $val = $balise->attr_get_i('group_number');
        print FILE "\nGroup number: $val\n";
        foreach my $balise2 ($tree->find_by_tag_name('protein')) {
        	my $ac = $balise2->attr_get_i('protein_name');
    	my $proba = $balise2->attr_get_i('probability');
    	my $coverage =$balise2->attr_get_i('percent_coverage');
    	my $usp = $balise2->attr_get_i('unique_stripped_peptides');
    	my $nom = $balise2->find_by_tag_name('annotation')->attr_get_i('protein_description');
    	print FILE "$ac\t$nom\t$proba\t$coverage\t$usp\n";
    	my $aci = $balise2->find_by_tag_name('indistinguishable_protein')->find_by_tag_name('annotation')->attr_get_i('protein_description');
    	my $naci = $balise2->find_by_tag_name('indistinguishable_protein')->find_by_tag_name('annotation')->attr_get_i('protein_description');
    	print FILE "$aci\t$naci\n";
    	}
    }
    Malheureusement, il n'écrit que la première indistiguishable_protein mais pas les suivantes.
    Quel est le problème ?

    @ ++
    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
    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
    Finalement, je pense avoir trouvé :
    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
     
    #!/usr/bin/perl
    use warnings;
    use XML::Parser;
    use XML::TreeBuilder;
     
    my $file = 'interact-prot.xml';
    my $tree = XML::TreeBuilder->new();
     
    $tree->parse_file($file);
    #Proteine
    foreach my $balise ($tree->find_by_tag_name('protein_group')){
        open FILE, ">>Results.txt" or die "Peut pas ouvrir Result.txt !!";
        $val = $balise->attr_get_i('group_number');
        print FILE "\nGroup number: $val\n";
        my $ac = $balise->find_by_tag_name('protein')->attr_get_i('protein_name');
        my $proba = $balise->find_by_tag_name('protein')->attr_get_i('probability');
        my $coverage =$balise->find_by_tag_name('protein')->attr_get_i('percent_coverage');
        my $usp = $balise->find_by_tag_name('protein')->attr_get_i('unique_stripped_peptides');
        my $nom = $balise->find_by_tag_name('protein')->find_by_tag_name('annotation')->attr_get_i('protein_description');
        print FILE "$ac\t$nom\t$proba\t$coverage\t$usp\n";
    #}
    #Indistinctes
    foreach my $balise2 ($balise->find_by_tag_name('indistinguishable_protein')){
        my $aci = $balise2->attr_get_i('protein_name');
        my $naci = $balise2->find_by_tag_name('annotation')->attr_get_i('protein_description');
        print FILE "$aci\t$naci\n";
    }
    #Peptide
    foreach my $balise3 ($balise->find_by_tag_name('peptide')){
        my $sequence = $balise3->attr_get_i('peptide_sequence');
        my $charge = $balise3->attr_get_i('charge');
        my $initproba = $balise3->attr_get_i('initial_probability');
        print FILE "$sequence\t$charge\t$initproba\n";
    }
    }
    Merci à tout ceux qui se seront penchés (attention, les mecs vous allez tomber ) sur ce problème.

    @ ++
    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.

  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
    Ok, l'algo est correct !

    @ ++
    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.

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

Discussions similaires

  1. [Débutant] Ajouter des noeuds enfant dans un noeud (XML)
    Par dad72 dans le forum C#
    Réponses: 1
    Dernier message: 28/10/2011, 23h44
  2. Réponses: 1
    Dernier message: 05/03/2010, 13h30
  3. lire un fichier XML avec des noeuds, enfants, etc
    Par thor76160 dans le forum C#
    Réponses: 23
    Dernier message: 04/09/2009, 15h14
  4. [C#-XML] Récupérer les valeurs des noeuds enfants
    Par cyllix dans le forum Windows Forms
    Réponses: 1
    Dernier message: 23/06/2006, 11h54
  5. [SimpleXML] XML et parcours des noeuds avec foreach
    Par kult dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 15/11/2005, 15h36

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