Página 1 de 1

Ayuda para procesar este XML

NotaPublicado: 2016-05-17 08:52 @411
por Alfumao
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.004 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.

;)

Re: Ayuda para procesar este XML

NotaPublicado: 2016-05-17 16:33 @731
por explorer
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

Re: Ayuda para procesar este XML

NotaPublicado: 2016-05-18 03:09 @173
por Alfumao
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!

Re: Ayuda para procesar este XML

NotaPublicado: 2016-05-18 16:57 @748
por explorer
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.