Bonjour,
J'ai un petit soucis pour parser un fichier xml (c'est un fichier SBML en fait). Voici un exemple du fichier xml à parser :
Je dois récupérer l'id de chaque réaction et la valeur de l'attribut species pour chaque reactif puis pour chaque produit. Voici le code que j'ai fait :
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 <?xml version="1.0" encoding="UTF-8"?> <sbml xmlns="http://www.sbml.org/sbml/level2" version="1" level="2" xmlns:html="http://www.w3.org/1999/xhtml"> <model id="ECOLI149" name=""> <reaction id="GLUC1PURIDYLTRANS__45__RXN" name="UTP--glucose-1-phosphate uridylyltransferase" reversible="true"> <listOfReactants> <speciesReference species="UTP" stoichiometry="1"/> <speciesReference species="GLC__45__1__45__P" stoichiometry="1"/> </listOfReactants> <listOfProducts> <speciesReference species="UDP__45__GLUCOSE" stoichiometry="1"/> </listOfProducts> </reaction> <reaction id="_1__46__1__46__1__46__271__45__RXN" name="GDP-L-fucose synthase" reversible="false"> <listOfReactants> <speciesReference species="GDP__45__4__45__DEHYDRO__45__6__45__DEOXY__45__D__45__MANNOSE" stoichiometry="1"/> </listOfReactants> <listOfProducts> <speciesReference species="GUANOSINE_DIPHOSPHATE_FUCOSE" stoichiometry="1"/> </listOfProducts> </reaction> <reaction id="KETOLACTOSE__45__RXN" name="&amp;beta;-galactosidase" reversible="false"> <listOfReactants> <speciesReference species="_3__45__KETOLACTOSE" stoichiometry="1"/> </listOfReactants> <listOfProducts> <speciesReference species="GLC" stoichiometry="1"/> <speciesReference species="CPD__45__1242" stoichiometry="1"/> </listOfProducts> </reaction></model></sbml>
L'erreur renvoyée est "can't locate object method "getAttribute" via package XML::LibXML::Text" donc en gros il n'arrive pas à trouver cette méthode qui récupere l'attribut alors que quand je mets hasAttributes à la place il me dit qu'il y a bien des attributs. Par contre si je fais $child->nodeName il me renvoie parfois des "#test" et parfois le nom du noeud soit speciesReference. Le problème vient donc apperemment de ce que contient le noeud, je l'ai peut être mal récupéré :s.
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 #!/usr/bin/perl -w use strict; use warnings; use XML::LibXML; use Data::Dumper; my $FichierXML = 'testxml.xml'; my $parser = XML::LibXML->new(); my $tree = $parser->parse_file($FichierXML); # Creation du fichier resultat open(FILE, ">resultat.txt" ) or die("Impossible d'ouvrir le fichier \n$!"); # Racine du document XML my $root = $tree->getDocumentElement; # Balise personne my @reactions = $root->getElementsByTagName('reaction'); foreach my $rxn (@reactions) { ## on print le nom de la reaction print FILE "Reaction : "; print FILE $rxn->getAttribute('id')."\n"; # on print le nom de chaque reactif my @KinderLOR = $root->getElementsByTagName('listOfReactants'); foreach my $child ($KinderLOR[0]->childNodes){ print $child->nodeName."\n"; print $child->getAttribute('species'); } } close(FILE);
Voila, je suis pas sure d'avoir été claire :s, en esperant que quelqu'un sera m'aider parce que j'avoue que je sèche.
Merci beaucoup d'avance.
Partager