Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Web » Recorrer XML con atributos Responder al tema
Nuevo tema


Página 1 de 2  [ 16 mensajes ]  Ir a página 1, 2  Siguiente
 
Nota 2011-03-26 06:28 @311

Perlero Nuevo
Registrado: 2011-03-26 06:22 @307
Mensajes: 11
Recorrer XML con atributos
Hola. Pretendo recorrer este XML:

Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
  1. <eSummaryResult>
  2.   <DocSum>
  3.     <Id>1001445</Id>
  4.     <Item Name="PubDate" Type="Date">1976 Dec 1</Item>
  5.     <Item Name="EPubDate" Type="Date"/>
  6.     <Item Name="Source" Type="String">FEBS Lett</Item>
  7.     <Item Name="AuthorList" Type="List">
  8.         <Item Name="Author" Type="String">Chauvet MT</Item>
  9.         <Item Name="Author" Type="String">Codogno P</Item>
  10.         <Item Name="Author" Type="String">Chauvet J</Item>
  11.         <Item Name="Author" Type="String">Acher R</Item>
  12.     </Item>
  13.     <Item Name="LastAuthor" Type="String">Acher R</Item>
  14.     <Item Name="Title" Type="String">Characterization of porcine MSEL-neurophysin.</Item>
  15.     <Item Name="Volume" Type="String">71</Item>
  16.     <Item Name="Issue" Type="String">2</Item>
  17.     <Item Name="Pages" Type="String">291-3</Item>
  18.     <Item Name="LangList" Type="List">
  19.         <Item Name="Lang" Type="String">English</Item>
  20.     </Item>
  21.     <Item Name="NlmUniqueID" Type="String">0155157</Item>
  22.     <Item Name="ISSN" Type="String">0014-5793</Item>
  23.     <Item Name="ESSN" Type="String">1873-3468</Item>
  24.     <Item Name="PubTypeList" Type="List">
  25.         <Item Name="PubType" Type="String">Journal Article</Item>
  26.     </Item>
  27.     <Item Name="RecordStatus" Type="String">PubMed - indexed for MEDLINE</Item>
  28.     <Item Name="PubStatus" Type="String">ppublish</Item>
  29.     <Item Name="ArticleIds" Type="List">
  30.         <Item Name="pubmed" Type="String">1001445</Item>
  31.         <Item Name="pii" Type="String">0014-5793(76)80953-2</Item>
  32.     </Item>
  33.     <Item Name="History" Type="List">
  34.         <Item Name="pubmed" Type="Date">1976/12/01 00:00</Item>
  35.         <Item Name="medline" Type="Date">1976/12/01 00:01</Item>
  36.         <Item Name="entrez" Type="Date">1976/12/01 00:00</Item>
  37.     </Item>
  38.     <Item Name="References" Type="List"/>
  39.     <Item Name="HasAbstract" Type="Integer">0</Item>
  40.     <Item Name="PmcRefCount" Type="Integer">1</Item>
  41.     <Item Name="FullJournalName" Type="String">FEBS letters</Item>
  42.     <Item Name="ELocationID" Type="String"/>
  43.     <Item Name="SO" Type="String">1976 Dec 1;71(2):291-3</Item>
  44.   </DocSum>
  45.  
  46.   <DocSum>
  47.     <Id>100152</Id>
  48.     <Item Name="PubDate" Type="Date">1978 Nov</Item>
  49.     <Item Name="EPubDate" Type="Date"/>
  50.     <Item Name="Source" Type="String">Blood</Item>
  51.     <Item Name="AuthorList" Type="List">
  52.         <Item Name="Author" Type="String">Borgers M</Item>
  53.         <Item Name="Author" Type="String">Verhaegen H</Item>
  54.         <Item Name="Author" Type="String">De Brabander M</Item>
  55.     </Item>
  56.     <Item Name="LastAuthor" Type="String">Geuens G</Item>
  57.     <Item Name="Title" Type="String">Purine nucleoside phosphorylase in chronic lymphocytic leukemia (CLL).</Item>
  58.   </DocSum>
  59. </eSummaryResult>


Lo que me interesa es coger el <id>, que ya lo tengo, y después coger el contenido de <Item Name="Title" Type="String"> que está relacionado con ese <id>.

He visto el módulo XML::parser pero no acabo de entender cómo lo puedo usar.

¿Me podéis ayudar?


Nota 2011-03-26 08:35 @399

Perlero Nuevo
Registrado: 2011-03-26 06:22 @307
Mensajes: 11
Re: Recorrer XML con atributos
Acabo de instalar el módulo de XML::DOM pero no veo cómo usarlo tampoco.


Nota 2011-03-26 08:59 @416
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Recorrer XML con atributos
Bienvenido a los foros de Perl en español, dexposito.

Una forma de hacerlo es con módulos, desde luego. Aquí tienes un ejemplo, con XML::Trivial (aunque... de trivial tiene poco)
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use XML::Trivial ();
  7.  
  8. my $xml = XML::Trivial::parseFile('code_25189.xml');
  9.  
  10. my @docsum = $xml->{eSummaryResult}->ea;
  11.  
  12. for my $docsum (0 .. @docsum-1) {
  13.  
  14.     print "Id: ", $xml->{eSummaryResult}->{$docsum}->{Id}->ta, "\n";
  15.  
  16.     for my $item ($xml->{eSummaryResult}->{$docsum}->ea) {
  17.    
  18.         if ($item->en eq 'Item'  and  $item->ah('Name') eq 'Title') {
  19.             print "\tTitle: ", $item->ta, "\n";
  20.         }
  21.     }
  22. }

_________________
JF^D Perl programming


Nota 2011-03-26 09:18 @429

Perlero Nuevo
Registrado: 2011-03-26 06:22 @307
Mensajes: 11
Re: Recorrer XML con atributos
Y cómo puedo hacer para que en esta línea
my $xml = XML::Trivial::parseFile('code_25189.xml');

lo que le metes a parseFile() yo lo obtengo de una URL de esta forma:

$pubID = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=1123";

my $respuesta = get( $pubID );


¿Cómo puedo hacer que me lo acepte el parseFile()? Porque si lo pongo de esta forma no me lo coge bien:

my $doc = $parser->parsefile($respuesta);


Nota 2011-03-26 10:14 @468

Perlero Nuevo
Registrado: 2011-03-26 06:22 @307
Mensajes: 11
Re: Recorrer XML con atributos
Esto es que lo que tengo:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $pubID = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=". $pubID;
  2. my $respuesta = get( $pubID );
  3. #my $DocSum = XMLin($respuesta);
  4. my $doc = $parser->parsefile($respuesta);
  5.  
  6. foreach my $DocSum ($doc->getElementsByTagName('DocSum')){
  7.   print $DocSum->getElementsByTagName('Id');
  8.   print "\n";
  9. }


Me da error cuando intenta hacer my $doc = $parser->parsefile($respuesta);
y me dice:
No such file or directory at actPub.pl line 47
que es la línea que te he comentado.

He probado de instalar el módulo de Trivial.pm pero al probarlo no me deja. Dice que:
Weak references are not implemented in the version of perl...
y he mirado por foros que es por la versión del Perl. No puedo cambiar la versión del Perl que no es mi ordenador, es el de una institución y no tengo permisos. Por eso lo estoy intentando hacer con XML::DOM.


Nota 2011-03-26 10:55 @496
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Recorrer XML con atributos
No es parseFile() la que debes usar, sino la función parse().

¿Qué versión de Perl tienes instalada? Lo puedes saber ejecutando perl -V.

Cualquier versión de Perl anterior a Perl v5.10 se considera que es vieja.

_________________
JF^D Perl programming


Nota 2011-03-26 10:58 @498
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Recorrer XML con atributos
Aquí tienes otra versión, usando XML::Smart.
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use XML::Smart;
  7.  
  8. my $pubIP = 1;
  9.  
  10. my $xml = XML::Smart->new("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=$pubID");
  11.  
  12. for my $docsum ( @{$xml->{eSummaryResult}->{DocSum}} ) {
  13.     print $docsum->{Id} , "  ", $docsum->{Item}('Name', 'eq', 'Title'), "\n";
  14. }

_________________
JF^D Perl programming


Nota 2011-03-26 10:59 @499

Perlero Nuevo
Registrado: 2011-03-26 06:22 @307
Mensajes: 11
Re: Recorrer XML con atributos
Está instalada la 5.8.7. Ya sé que es vieja pero la gente de allí no quiere actualizarse. Por eso XML::Trivial no me va.

Voy a probar a instalar la que me acabas de decir, Smart, a ver si va. Gracias, ahora te comento. ¡je,je!


Nota 2011-03-26 11:07 @505
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Recorrer XML con atributos
dexposito escribió:
Está instalada la 5.8.7. Ya sé que es vieja pero la gente de allí no quiere actualizarse. Por eso XML::Trivial no me va.

Según la matriz de compatibilidad, XML::Trivial solo funciona con Perl v5.8.7 en Linux.

Prueba con XML::Smart. Mientras, voy a ver cómo se hace con XML::DOM.

Tranquilo, hay centenares de módulos Perl en CPAN solo para gestionar XML ;)

_________________
JF^D Perl programming


Nota 2011-03-26 11:23 @516

Perlero Nuevo
Registrado: 2011-03-26 06:22 @307
Mensajes: 11
Re: Recorrer XML con atributos
Muchísimas gracias, va perfecto. Un poco lento pero es por el servidor que la gente lo está colapsando, pero lo que me has pasado va perfecto.

Gracias otra vez, si tengo algún problema más ya te consultaré.


Nota 2011-03-26 12:31 @563
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Recorrer XML con atributos
Con XML::DOM no he conseguido hacerlo. En cambio, con XML::Simple, ha sido sencillo:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use XML::Simple;
  7. use LWP::Simple;
  8.  
  9. my $pubID = 1;
  10.  
  11. my $pagina = get("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=$pubID");
  12.  
  13. my $xml = XMLin($pagina, ForceArray => [ 'DocSum', 'Item' ], ForceContent => 1);
  14.  
  15. for my $docsum ( @{ $xml->{DocSum} } ) {
  16.  
  17.     print "Id: ", $docsum->{'Id'}->{'content'}, " : ";
  18.  
  19.     for my $item ( @{ $docsum->{Item} } ) {
  20.  
  21.         next if $item->{'Name'} ne 'Title';
  22.  
  23.         print $item->{'content'};
  24.     }
  25.    
  26.     print "\n";
  27. }

_________________
JF^D Perl programming


Nota 2011-04-23 10:59 @499

Perlero Nuevo
Registrado: 2011-03-26 06:22 @307
Mensajes: 11
Re: Recorrer XML con atributos
Buenas tardes,

Ya me solucionaste en su día el problema que tenía al recorrer los XML con Perl.

Ahora tengo la siguiente pregunta: tengo este programa que me recorre un XML para ir actualizando una base de datos:

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. $pubID
  2.     = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=gene&id="
  3.     . $pubID;
  4.  
  5. #my $pubIP = 1;
  6.  
  7. my $xml = XML::Smart->new($pubID);
  8.  
  9. my $sth1;
  10. my $alias;
  11.  
  12. for my $docsum ( @{ $xml->{eSummaryResult}->{DocSum} } ) {
  13.  
  14.     print $docsum->{Id}, "\n";
  15.  
  16.     $alias = $docsum->{Item}( 'Name', 'eq', 'OtherAliases' );
  17.  
  18.     $sth1
  19.         = $dbh->prepare('UPDATE gene_info_21 SET Alias = ? WHERE GeneID = ?')
  20.         or die( "Couldn't prepare statement: " . $dbh->errstr );
  21.     $sth1->execute( $alias, $docsum->{Id} )
  22.         or die( "Couldn't execute statement: " . $sth1->errstr );
  23.  
  24. }


Resulta que hay veces que me da error cuando abro el xml, o cuando lo empiezo a recorrer, supongo que porque el xml no estará bien formado. El caso es que me da un error el perl y me para de recorrer el xml. ¿Hay alguna forma de capturar ese error y que siga con la ejecución del programa?

Este trozo de código que te he pasado está dentro de un bucle y voy llamando abriendo un xml diferente en cada iteración, lo que quiero es que si me da error en un xml, siga a la siguiente iteración del bucle y no pare la ejecución, ya que aunque no me actualice los datos que contiene el xml que ha dado error, como son pocos, me da igual. En la siguiente actualización ya se hará bien.

Espero haberme explicado bien, gracias por la ayuda.


Última edición por explorer el 2011-04-23 11:29 @520, editado 2 veces en total
Formatear el código con Perltidy. Poner coloreado de sintaxis Perl


Nota 2011-04-23 13:22 @598
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Recorrer XML con atributos
Pero... ¿qué tipo de error? ¿sale un error en pantalla? ¿en qué línea o en qué momento?

Quizás puedas resolverlo con una sentencia eval {}. O usar el módulo recomendado por la comunidad, Try::Tiny.

_________________
JF^D Perl programming


Nota 2011-04-30 08:29 @395

Perlero Nuevo
Registrado: 2011-03-26 06:22 @307
Mensajes: 11
Re: Recorrer XML con atributos
Entonces, ¿crees que, por ejemplo, para seguir con la ejecución podría poner esto?
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. try {
  2.         my $xml=XML::Smart->new($pubID);
  3.     } catch {
  4.         print FILE "Error XML";
  5.     }


¿y así me guarda los errores en un archivo y sigo con la ejecución?

Tengo que probarlo aún que esta parte del proyecto la he dejado un poco parada, pero si más o menos es lo que tendría que hacer para no parar la ejecución del programa cuando hay un error en el xml me iría perfecto.


Nota 2011-04-30 08:35 @399
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10272
Re: Recorrer XML con atributos
No puedes poner el my() dentro de un contexto de llaves {}: la variable $xml no será conocida fuera de ese contexto.

Mejor pon el my $xml; antes de esas línea, y luego haces el $xml = XML::Smart....

_________________
JF^D Perl programming


Responder al tema  [ 16 mensajes ]  Ir a página 1, 2  Siguiente

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO