salut à tous,
quelqu'un aurait il un script perl permettant de parser de fichiers xml, je rame please, que ce soit avec des modules sax ou dom, importe.
Oubien en perl standard. J'ai fouileer pleins de doc , mais c pas trop clair
merci
salut à tous,
quelqu'un aurait il un script perl permettant de parser de fichiers xml, je rame please, que ce soit avec des modules sax ou dom, importe.
Oubien en perl standard. J'ai fouileer pleins de doc , mais c pas trop clair
merci
Y'a des choses déjà faites et utilisées, faut en profiter...
Y'a XML:arser par exemple.
Bonjour à toi,
sois un peu plus précis STP.
S'il s'agit juste de récupérer qq données ici et là les expressions régulières de PERL feront très bien l'affaire.
Si tu as besoin d'un traitement plus pointu alors effectivement le module SAX sera intéressant.
La balle est dans ton camp.
Je voudrais récupérer des données dans mon fichier xml, ce serait pour parser une banque de données (interpro pour les connaisseur, banque de données bio). Ces données sont soit dans les balises, donc correspondent aux attirbuts, soit entre certaines balises. J'ai trouvé un programme SAX me permettant de choper les balises ouvrantes et fermantes, ainsi que les attibuts, mais je souhaiterais certaines donnéesentre des balises particuliere, comment faire.
Les modules bioperl ne sont pas tres efficaaces, et j'ai un peu de mal,
merci.
Voici le programme sax:
voici mon fichier xml:
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 package MyHandler; use strict; sub new { my $type = shift; return bless {}, $type; } sub start_element { my ($self, $el) = @_; print "Start $el->{Name}\n"; my %a = %{ $el->{Attributes} }; foreach (keys %a) { print " Attribut $_ => $a{$_}\n"; } } sub end_element { my $self=shift; my $el=shift; print "End $el->{Name}\n"; } package main; use strict; use XML::Parser::PerlSAX; import MyHandler; my $my_handler = MyHandler->new; my $parser = XML::Parser::PerlSAX->new( Handler => $my_handler ); die "I need an XML file as argument" unless $ARGV[0]; $parser->parse( Source => { SystemId => $ARGV[0] } );
Please, help
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145 <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE interprodb SYSTEM "interpro.dtd"> <interprodb><release><dbinfo dbname="INTERPRO" version="7.2" entry_count="10709" file_date="29-MAR-2004 00:00:00" /> <dbinfo dbname="SWISS" version="42.11" entry_count="146193" file_date="01-MAR-2004 00:00:00" /> <dbinfo dbname="TREMBL" version="25.11" entry_count="1070786" file_date="01-MAR-2004 00:00:00" /> <dbinfo dbname="PRINTS" version="37.0" entry_count="1850" file_date="19-SEP-2003 00:00:00" /> <dbinfo dbname="PREFILE" version="N/A" entry_count="131" file_date="12-OCT-2003 00:00:00" /> <dbinfo dbname="PROSITE" version="18.10" entry_count="1659" file_date="12-OCT-2003 00:00:00" /> <dbinfo dbname="PFAM" version="12.0" entry_count="7316" file_date="01-FEB-2004 00:00:00" /> <dbinfo dbname="PRODOM" version="2002.1" entry_count="1021" file_date="28-NOV-2002 00:00:00" /> <dbinfo dbname="SMART" version="4.0" entry_count="663" file_date="19-JAN-2004 00:00:00" /> <dbinfo dbname="TIGRFAMs" version="3.0" entry_count="1977" file_date="16-OCT-2003 00:00:00" /> <dbinfo dbname="SSF" version="1.63" entry_count="552" file_date="08-OCT-2003 00:00:00" /> <dbinfo dbname="PIRSF" version="2.41" entry_count="219" file_date="01-OCT-2003 00:00:00" /> </release><interpro id="IPR000001" type="Domain" short_name="Kringle" protein_count="183"><name>Kringle</name> <abstract> Kringles are autonomous structural domains, found throughout the blood clotting and fibrinolytic proteins. Kringle domains are believed to play a role in binding mediators (e.g., membranes, other proteins or phospholipids), and in the regulation of proteolytic activity <cite idref="PUB00002414"/>, <cite idref="PUB00001541"/>, <cite idref="PUB00003257"/>. Kringle domains <cite idref="PUB00003400"/>, <cite idref="PUB00000803"/>, <cite idref="PUB00001620"/> are characterised by a triple loop, 3-disulphide bridge structure, whose conformation is defined by a number of hydrogen bonds and small pieces of anti-parallel beta-sheet. They are found in a varying number of copies in some plasma proteins including prothrombin and urokinase-type plasminogen activator, which are serine proteases belonging to MEROPS peptidase family S1A. </abstract> <example_list> <example> <db_xref dbkey="P00748" db="SWISS" />Blood coagulation factor XII (Hageman factor) (1 copy) </example> <example> <db_xref dbkey="P00749" db="SWISS" />Urokinase-type plasminogen activator (1 copy) </example> <example> <db_xref dbkey="Q04756" db="SWISS" />Hepatocyte growth factor activator (1 copy) </example> <example> <db_xref dbkey="P06867" db="SWISS" />Plasminogen (5 copies) </example> <example> <db_xref dbkey="P26927" db="SWISS" />Hepatocyte growth factor like protein (4 copies) </example> <example> <db_xref dbkey="P00735" db="SWISS" />Thrombin (2 copies) </example> <example> <db_xref dbkey="P15638" db="SWISS" />Tissue plasminogen activator (TPA) (2 copies) </example> <example> <db_xref dbkey="P08519" db="SWISS" />Apolipoprotein A (38 copies) </example> </example_list> <pub_list> <publication id="PUB00002414"> <author_list>McMullen B.A., Fujikawa K.</author_list> <title>Primary structure of the heavy chain of human factor XIIa.</title> <db_xref db="PUBMED" dbkey="3886654" /> <journal>J. Biol. Chem.</journal> <location firstpage="5328" lastpage="5341" volume="260" /> <year>1985</year> </publication> <publication id="PUB00001541"> <author_list>Patthy L., Trexler M., Vali V., Banyai L., Varadi A.</author_list> <title>Kringles: Modules specialized for protein binding.</title> <db_xref db="PUBMED" dbkey="6373375" /> <journal>FEBS Lett.</journal> <location firstpage="131" lastpage="136" volume="171" /> <year>1984</year> </publication> <publication id="PUB00003257"> <author_list>Atkinson R.A., Williams R.J.P.</author_list> <title>Solution structure of the kringle 4 domain from human plasminogen by 1H nuclear magnetic resonance spectroscopy and distance geometry.</title> <db_xref db="PUBMED" dbkey="2157850" /> <journal>J. Mol. Biol.</journal> <location firstpage="541" lastpage="552" volume="212" /> <year>1990</year> </publication> <publication id="PUB00003400"> <author_list>Castellino F.J., Beals J.M.</author_list> <title>The genetic relationships between the kringle domains of human plasminogen, prothrombin, tissue plasminogen activator, urokinase, and coagulation factor XII.</title> <db_xref db="PUBMED" dbkey="3131537" /> <journal>J. Mol. Evol.</journal> <location firstpage="358" lastpage="369" volume="26" /> <year>1987</year> </publication> <publication id="PUB00000803"> <author_list>Patthy L.</author_list> <title>Evolution of the proteases of blood coagulation and fibrinolysis by assembly from modules.</title> <db_xref db="PUBMED" dbkey="3891096" /> <journal>Cell</journal> <location firstpage="657" lastpage="663" volume="41" /> <year>1985</year> </publication> <publication id="PUB00001620"> <author_list>Ikeo K., Takahashi K., Gojobori T.</author_list> <title>Evolutionary origin of numerous kringles in human and simian apolipoprotein(a).</title> <db_xref db="PUBMED" dbkey="1879523" /> <journal>FEBS Lett.</journal> <location firstpage="146" lastpage="148" volume="287" /> <year>1991</year> </publication> </pub_list> <found_in> <rel_ref ipr_ref="IPR003966" /> <rel_ref ipr_ref="IPR008293" /> </found_in> <member_list> <db_xref protein_count="151" db="PRINTS" dbkey="PR00018" name="KRINGLE" /> <db_xref protein_count="179" db="PROFILE" dbkey="PS50070" name="KRINGLE_2" /> <db_xref protein_count="196" db="PROSITE" dbkey="PS00021" name="KRINGLE_1" /> <db_xref protein_count="178" db="PFAM" dbkey="PF00051" name="Kringle" /> <db_xref protein_count="171" db="PRODOM" dbkey="PD000395" name="Kringle" /> <db_xref protein_count="149" db="SMART" dbkey="SM00130" name="KR" /> </member_list> <external_doc_list> <db_xref db="BLOCKS" dbkey="IPB000001" /> <db_xref db="PDB" dbkey="1a0h" /> <db_xref db="PDB" dbkey="1bht" /> <db_xref db="PDB" dbkey="1i71" /> <db_xref db="PDB" dbkey="1jfn" /> <db_xref db="PDB" dbkey="1ki0" /> <db_xref db="PDB" dbkey="1krn" /> <db_xref db="PDB" dbkey="1pkr" /> <db_xref db="PDB" dbkey="1pml" /> <db_xref db="PDB" dbkey="1tpk" /> <db_xref db="PDB" dbkey="1urk" /> <db_xref db="PDB" dbkey="2hpq" /> <db_xref db="PDB" dbkey="2pf1" /> <db_xref db="PDB" dbkey="2pf2" /> <db_xref db="PDB" dbkey="2pk4" /> <db_xref db="PDB" dbkey="3kiv" /> <db_xref db="PDB" dbkey="5hpg" /> <db_xref db="MEROPS" dbkey="S1" /> <db_xref db="PDOC" dbkey="PDOC00020" /> </external_doc_list> <structure_db_links> <db_xref db="CATH" dbkey="2.40.20.10.1" /> <db_xref db="SCOP" dbkey="g.14.1.1" /> </structure_db_links> <taxonomy_distribution> <taxon_data name="Arthropoda" proteins_count="4" /> <taxon_data name="Chordata" proteins_count="167" /> <taxon_data name="Eukaryota" proteins_count="183" /> <taxon_data name="Green Plants" proteins_count="1" /> <taxon_data name="Metazoa" proteins_count="178" /> <taxon_data name="Nematoda" proteins_count="4" /> <taxon_data name="Plastid Group" proteins_count="5" /> </taxonomy_distribution> </interpro> </interprodb>
djibril[/b]
Re bonjour,
ton fichier d'entrée m'a l'air assez conséquent.
En perl c'est tout à fait faisable mais pas très fiable si tu ne blinde pas ton code.
Je pense que dans ton cas une petite XSL et un processeur XSLT comme XSLTProc feraient très bien l'affaire.
En ce qui concerne le XSLTProc c'est un processeur de XSL écrit en C ... donc très rapide et basé sur un moteur SAX.
XSLTProc est en général dispo sur toutes les distrib linux ou unix.
Au pire il se trouve et s'installe facilement : http://packages.debian.org/unstable/text/xsltproc
Si vraiment tu es dans l'urgence envoie moi un fichier XML complet que tu as à traiter ainsi que la liste des données que tu voudrais extraire et je t'écrirai ta XSL (y'en a pas pour plus d'1/2 heure si tu ne veux pas faire des trucs tordus)
Voilà c'est tout ce que je peux faire.
A++
Bonjour Rohd'man,
Merci pour ton aide, je connais pas le XSL et XSLT, je vais jeter un coup d'oeil sur le site de l'laltruiste, histoire de me faire une idée.
Je t'aurais bien envoyé le fichier xml complet, mais il fait 31Mo (interpro.xml téléchargé sur EBI, je sais pas si tu connais). Mais comme je l'ai ecris ci dessus, c le format de base, je peux t'envoyer un fichier contenant les info sur deux proteines, et tu verras le format général!!!!
Je pense que si tu peux me le faire sur un petit fichier, je pourrais l'etendre sur tout, non? j'en sais rien. Car les données que je veux extraire sont les mêmes pour tous.
Alors si c possible de t'envoyer les 31 Mo, no probleme, ou bien je te donne l'address du site ou je l'ai telechargé (sous unix)? sinon je t'envoie un fichier complet sur deux prot avec les info à extraire? C'est comme tu veux en fonction de ton temps, de tes disponibilités, c'est urgent.
Je te remercie pour tout
Djibril
J'ai pas trop lu ton probleme par contre j'ai recupéré des données xml dans une page web à partir d'un fichier xml voila comment je fais si ca peux t'aider. En lisant le code source tu peux trouver l'original du xml
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132 #!/usr/bin/perl #Script qui permet d'extraire une partie du fichier d'info guilde de goa et de l'afficher à l'écran. #il faut ensuite rediriger la sortie de façon à obtenir une page web # ex: server-stat.pl > server.php use warnings; use LWP::UserAgent; use XML::Parser; my $export; my $char; my $member; my $upd; my $lwrp=0; # Create a user agent object my $ua = LWP::UserAgent->new(); $ua->agent("Colymar/0.1 "); $ua->timeout(30); # Create a request my $req = HTTP::Request->new(GET => 'http://camelot-europe.goa.com/herald/servers/Broceliande/guilds/11.xml'); #Pass request to the user agent and get a response back my $res = $ua->request($req); #Check response #if success parse if ($res->is_success) { #Parser xml my $parser = new XML::Parser(Style=>'Subs', Pkg=>'SubHandlers', ErrorContext => 2); $parser->setHandlers(Char => \&char_handler); $parser->parse($res->content); } # --------------------------------------------- sub char_handler { my ($p, $data) = @_; $export=$data; } # --------------------------------------------- package SubHandlers; sub guild_status { print "<html>\n<head></head>\n"; print '<body bgcolor="#000000" text="#808080">'; print "\n"; #affichage embleme Cy print '<table border="0" width="100%">'; print "\n<tr>\n"; print '<td width="8%" valign="top"><img border="0" src="images/Embleme_cy_daoc.gif" width="34" height="44"></td>'; print "\n"; } sub guild_status_ { #fermeture tag print "</body>\n</html>";; } sub guild { my $expat = shift; my $element = shift; # Read the attributes while (@_) { my $att = shift; my $val = shift; $attr{$att} = $val; } my $name = $attr{'name'}; my $activechars = $attr{'activechars'}; my $activemembers = $attr{'activemembers'}; my $guildrp = $attr{'guildrp'}; my $timestamp = $attr{'timestamp'}; print '<td width="92%"><b><font color="#C0C0C0" size="3">'; print "$name</font></b>\n"; #Affichage Guild RP print "<br><br>\n<table>\n<tr>\n"; print '<td noWrap><font size="1">Guild RP:</font></td>'; print "\n<td>"; print '<font size="1">'; print "$guildrp</font></td></tr>\n"; $char=$activechars; $member=$activemembers; $upd=$timestamp; } sub guild_ { #Affichage du LWRP print "<tr>\n<td noWrap>"; print '<font size="1">Guild LRP:</font></td>'; print "\n<td>\n"; print '<p align="right"><font size="1">'; print "$lwrp</font></p>\n</td>\n</tr>\n"; print "\n</td>\n</tr>\n</table>\n</td>\n</tr>\n</table>\n"; #Affichage Active char print '<table border="0" width="100%">'; print "\n<tr>\n<td noWrap>"; print '<font size="1">Active Chars:</font></td>'; print "\n<td>\n"; print '<p align="right"><font size="1">'; print "$char</font></p>\n</td>\n</tr>\n"; #Affichage Active member print "<tr>\n<td noWrap>"; print '<font size="1">Active Member:</font></td>'; print "\n<td>\n"; print '<p align="right"><font size="1">'; print "$member</font></p>\n</td>\n</tr>\n</table>\n"; #Affichage mise a jour print '<p align="right"><font size="1" color="#666666">'; print "Updated : $upd</font></p></td>\n"; } sub lastweekrp { } sub lastweekrp_{ $lwrp= $lwrp+$export; }
Salut Djibril,
envoie moi l'url du fichier à télécharger (du boulot ça ne devrait pas me prendre très longtemps) ainsi que la liste et la mise en forme des données que tu veux récupérer.
Je verrais ce que je peux faire mais je ne te promets rien parce que j'ai déjà expérimenté les XSL sur un fichier de 3 Mo et ça prenait du temps alors 31 Mo ... ça va être chaud mais si je n'essaie pas je ne saurai pas.
Si ça ne fonctionne pas le meilleur moyen pour des fichiers de cette taille reste le perl, et je dois avoir qq bouts de codes en stock pour régler ton pb.
A++
Salut Rhod'man,
Voici l'url du fichier à parser: http://www.ebi.ac.uk/FTP/
Ensuite c'est dans databases, c'est interpro/interpro.xml.gz
ou bien essaye l'adresse ftp://ftp.ebi.ac.uk/pub/databases/interpro
Les données que je souhaiterais récupérer sont en gras:
Pour chaque proteines, les info dans cette balises:
Voilà en gros les infos dont j'aurais besoins. Je te remercie
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 - <interpro id="[b]IPR000001[/b]" type="[b]Domain[/b]" short_name="[b]Kringle[/b]" protein_count="183"> - Les données qui sont entre la balise <abstract>[b]....[/b]</abstract> - Dans la balise <member_list>: <db_xref protein_count="[b]151[/b]" db="[b]PRINTS[/b]" dbkey="[b]PR00018[/b]" name="[b]KRINGLE[/b]" /> - dans les balises <publication id="[b]PUB00001620[/b]">
A++
djibril
Je me suis fait un script tout con en Perl, et ça à l'air pas mal aussi, mais bon si je peux avoir un truc plus propre, ce serai meilleur je pense, voilà mon script:
#!/usr/bin/perl -w
use strict;
use Carp;
use DBI;
my $id;
my $type;
my $name;
my $file=$ARGV[0];
my $abstract_open="no";
my $abstract;
open (FILE, $file) || die "impossible d'ouvrir le fichier '$file':$!";
while(<FILE>){
chomp();
if($_=~ /^\s*<interpro id=\"(.*)\" type=\"(.*)\" short_name=\"(.*)\" protein_count/){
#if($_=~ /^<interpro id=\"(.*)/){
$id=$1;
$type=$2;
$name=$3;
print "###############################################################\n
###############################################################\n
id= $id\ttype= $type\tname= $name\n";
}
if($_=~/<abstract>/gi){
$abstract_open="yes";
}
if($abstract_open eq "yes"){
$abstract.="$_";
$abstract =~s/<.+>//gi;
$abstract =~s/<p>//gi;
$abstract =~s/<\/p>//gi;
$abstract =~s/\s\s+//gi;
}
if($_=~/<\/abstract>/gi){
print "-----------------------------abstract\n";
print "$abstract\n";
$abstract_open="no";
$abstract="";
}
if ($_ =~/^\s*<db_xref protein_count=\"(.*)\" db=\"(.*)\" dbkey=\"(.*)\" name=\"(.*)\" /)
{print "-----------------------------member liste\n";
print "prot_count= $1\tdb= $2\tdbkey= $3\tname= $4\n";
}
}
close(FILE);
Si ca peut t'aider voici ma version (on ne peux plus simple il me semble)
(ps a adapter -> initialiser $file)
#Parseur du fichier de structure
#!/usr/bin/perl
package Parser;
use XML:arser;
sub parse
{
die "Fichier xml de structure introuvable \"$file\"" unless -f $file;
#Mise en place du parseur
my $parser = new XML:arser(ErrorContext => 2);
$structure = Structure->new();
$parser->setHandlers(Start => \&start_handler,
End => \&end_handler,
Char => \&char_handler);
$parser->parsefile($file);
return $structure;
}
sub start_handler
{
#Récupération de la balise courante
my $expat = shift; my $element = shift;
$balise=$element;
}
sub char_handler
{
#Récupération des valeurs contenus entre les balises
$data="";
my ($p, $data) = @_;
if ($data =~ /\S/)
{
if($balise eq "titre"){
# Contenu de la balise se trouve donc dans $data, il n'y a plus qu'a la stocker
}
if($balise eq "taille_fenetre"){
...
}
if($balise eq "commande_exe"){
...
}
if($balise eq "couleur_claire"){
...
}
if($balise eq "couleur_fonce"){
...
}
if($balise eq "titre_signet"){
...
}
}
}
Ps: c'est du SAX (évenementiel)
merci, j'ai fait du sax et c bon, mais aussi avec des regex et c bon aussi.
Merci à tous![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager