• Publicidad

Ayuda para procesar este XML

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Ayuda para procesar este XML

Notapor Alfumao » 2016-05-17 08:52 @411

Buenas tardes.

Tengo un documento XML que necesitaría procesar. En concreto necesito extraer la información del atributo "HGNC" dentro de la etiqueta "result".

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <Tool>
  2. <schema xsi:schemaLocation="http://Tool/API/Prediction.xsd"/>
  3. <search id=" MIMAT0000246">
  4. <results>
  5. <result id="227" HGNC="Tmem50b" EnsEMBL="ENSMUSG00000022964">
  6. <miRNA>mmu-miR-122-5p</miRNA>
  7. <method_name>Mirtarbase</method_name>
  8. <result_type>external_info</result_type>
  9. <data_type>Branched DNA probe assay</data_type>
  10. <support_type>Functional MTI</support_type>
  11. <pmid>18438401</pmid>
  12. </result>
  13. </results>
  14. </search>
  15. </Tool>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Para procesar este XML se facilita un programa que yo he modificado para que me presente los resultados en un archivo de salida con un formato de texto separado por tabuladores:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. $|=1;
  3. use strict;
  4. use XML::LibXML;
  5.  
  6. my $SourceListingURL = "http://mirgate.bioinfo.cnio.es/ResT/API";
  7.  
  8. my $parser = XML::LibXML->new();
  9. my $xmldoc = $parser->parse_file($SourceListingURL);
  10. use Getopt::Long;
  11.  
  12. #usage: perl remote_miR.pl -p /path -l list -o organism -f miRNA_confirmed
  13.  
  14. my ($path, $list, $working_organism,$source);
  15. GetOptions(
  16.     'path=s'        => \$path,
  17.     'list=s'        => \$list,
  18.     'organism=s'    => \$working_organism,
  19.     'feature=s'     => \$source #"gene_confirmed","miRNA_confirmed","gene_miRNA_confirmed","miRNA_gene_confirmed";  
  20.     );
  21.  
  22. open (INFILE, "$path/$list") || die ("cannot open input file");
  23. chomp(my @mirna_of_interest = <INFILE>);
  24.  
  25. open  SALIDA,'>'."$path/Predictions"."$list" or die "ERROR: $!\n";
  26. #####################################################Example : retrieve experimentally validated information about my genes of interest#####################################
  27. #my $parser = XML::LibXML->new();
  28.  
  29. $working_organism="human";
  30.  
  31. foreach my $gene (@mirna_of_interest){    
  32.     my $SourceListingURL = "http://mirgate.bioinfo.cnio.es/ResT/API/$working_organism/$source/$gene";
  33.     my $xmldoc = $parser->parse_file($SourceListingURL);
  34.     print "There is/are " . scalar(@{$xmldoc->findnodes('/miRGate/search/results/result')}) . " experimentally validated experiments for $gene\n\n";
  35.     print SALIDA "There is/are " . scalar(@{$xmldoc->findnodes('/miRGate/search/results/result')}) . " experimentally validated experiments for $gene\n\n";
  36.  
  37.     my $cont=1;
  38.  
  39.         foreach my $confirmed_data ($xmldoc->findnodes('/miRGate/search/results/result')) {
  40.        
  41.             print "$cont" ." )";
  42.             print SALIDA "$cont";
  43.             foreach my $confirmed_attr ($confirmed_data->childNodes()){
  44.                 if($confirmed_data){
  45.                     #print "\t ". $confirmed_attr->localname .": " . $confirmed_attr->textContent."\n" ;
  46.                     #print SALIDA"\t ". $confirmed_attr->localname .": " . $confirmed_attr->textContent."\n" ;
  47.  
  48.                     #Imprimo un resultado por linea############################
  49.                     print "\t ". $confirmed_attr->textContent."\t" ;
  50.                     print SALIDA"\t ". $confirmed_attr->textContent."\t" ;
  51.                 }
  52.             }
  53.     $cont++;
  54.     print "\n";
  55.     print SALIDA "\n";
  56.         }
  57.     }  
  58. ##############################################################################################################################################################################
  59.  
  60.  __END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Pero si usamos este programa no me aparece por ningún lado el dato que comento al principio (atributo "HGNC" dentro de la etiqueta "result").

He intentado conseguirlo incluyendo estas lineas de código, en una versión posterior, pero parece que no soy capaz de capturar el susodicho dato.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $symbol=($xmldoc->findvalue('/miRGate/search/results/result/@HGNC')) ;
  2.                  print $confirmed_data->to_literal()."\n" ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Alguna sugerencia y/o ayuda?

Muchas gracias por adelantado.

;)
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Publicidad

Re: Ayuda para procesar este XML

Notapor explorer » 2016-05-17 16:33 @731

Esto... ¿y no es más fácil hacer lo obvio?
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3. use File::Slurp;
  4.  
  5. my $archivo = read_file('code_39480.xml');
  6.  
  7. my($HGNC) = $archivo =~ /<result .*?HGNC="(.+?)"/;
  8.  
  9. say $HGNC;  # Tmem50b
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ayuda para procesar este XML

Notapor Alfumao » 2016-05-18 03:09 @173

Hola, explorer.

Es más fácil hacer como dices, pero lo que quiero no es obtener solo ese valor, sino que necesito capturarlo e imprimirlo el primero de cada línea.

Con este código lo intento en las líneas 35 y 36, pero por algún motivo me captura todos los valores que corresponden a esa etiqueta y me los devuelve juntos... Os paso el script por si veis algún error obvio del que yo ya no me percato...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. $| = 1;
  3. use strict;
  4. use XML::LibXML;
  5.  
  6. #usage: perl remote_miRGate.pl -p /path -l list -o organism -f miRNA_confirmed
  7.  
  8. my ( $path, $list, $working_organism, $source );
  9. GetOptions(
  10.     'path=s'     => \$path,
  11.     'list=s'     => \$list,
  12.     'organism=s' => \$working_organism,
  13.     'feature=s'  => \$source                    #"gene_confirmed","miRNA_confirmed","gene_miRNA_confirmed","miRNA_gene_confirmed";
  14. );
  15.  
  16. my $SourceListingURL = "http://mirgate.bioinfo.cnio.es/ResT/API";
  17.  
  18. my $parser = XML::LibXML->new();
  19. my $xmldoc = $parser->parse_file($SourceListingURL);
  20. use Getopt::Long;
  21.  
  22. open( INFILE, "$path/$list" ) || die("cannot open input file");
  23. chomp( my @mirna_of_interest = <INFILE> );
  24.  
  25. open SALIDA, '>' . "$path/Predictions" . "$list" or die "ERROR: $!\n";
  26. #####################################
  27.  
  28. $working_organism = "human";
  29. foreach my $gene (@mirna_of_interest) {
  30.     my $SourceListingURL = "http://mirgate.bioinfo.cnio.es/ResT/API/$working_organism/$source/$gene";
  31.     my $xmldoc           = $parser->parse_file($SourceListingURL);
  32.     my $cont             = 1;
  33.     my $symbol;
  34.  
  35.     $symbol = ( $xmldoc->findnodes('/miRGate/search/results/result/@HGNC') );
  36.     print "$symbol\n";                         # ->to_literal()."\n" ;
  37.  
  38.     foreach my $confirmed_data ( $xmldoc->findnodes('/miRGate/search/results/result') ) {
  39.  
  40.         print "$cont\)\t$symbol\t";
  41.         print SALIDA "$cont\t$symbol\t";
  42.  
  43.         #print SALIDA"$symbol\t";
  44.         $symbol = ();
  45.         foreach my $confirmed_attr ( $confirmed_data->childNodes() ) {
  46.  
  47.             if ($confirmed_data) {
  48.  
  49.                 #Imprimo un resultado por linea#
  50.                 print "\t " . $confirmed_attr->textContent . "\t";
  51.                 print SALIDA"\t " . $confirmed_attr->textContent . "\t";
  52.             }
  53.         }
  54.         $cont++;
  55.         print "\n";
  56.         print SALIDA "\n";
  57.     }
  58. }
  59.  
  60.  __END__
  61.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


¡Muchas gracias una vez más!
Alfumao
Perlero nuevo
Perlero nuevo
 
Mensajes: 178
Registrado: 2009-12-10 11:20 @514

Re: Ayuda para procesar este XML

Notapor explorer » 2016-05-18 16:57 @748

Según la documentación de XML::LibXML::XPathContext, si llamas a findnodes() en contexto escalar, obtienes un objeto XML::LibXML::NodeList, que tienes que recorrer con get_nodelist(). O, desde el principio, llamas a findnodes() en contexto de lista, y guardas los nodos en un array. O recorrerlo como haces en la línea 38.

Entonces, lo que supongo que estás viendo es el contenido del Nodelist, con todos los valores seguidos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 12 invitados