• Publicidad

Recorrer XML con atributos

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Recorrer XML con atributos

Notapor dexposito » 2011-03-26 06:28 @311

Hola. Pretendo recorrer este XML:

Sintáxis: [ Descargar ] [ Ocultar ]
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>
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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?
dexposito
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-03-26 06:22 @307

Publicidad

Re: Recorrer XML con atributos

Notapor dexposito » 2011-03-26 08:35 @399

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

Re: Recorrer XML con atributos

Notapor explorer » 2011-03-26 08:59 @416

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)
Sintáxis: [ Descargar ] [ Ocultar ]
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. }
Coloreado en 0.002 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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recorrer XML con atributos

Notapor dexposito » 2011-03-26 09:18 @429

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);
dexposito
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-03-26 06:22 @307

Re: Recorrer XML con atributos

Notapor dexposito » 2011-03-26 10:14 @468

Esto es que lo que tengo:

Sintáxis: [ Descargar ] [ Ocultar ]
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. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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.
dexposito
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-03-26 06:22 @307

Re: Recorrer XML con atributos

Notapor explorer » 2011-03-26 10:55 @496

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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recorrer XML con atributos

Notapor explorer » 2011-03-26 10:58 @498

Aquí tienes otra versión, usando XML::Smart.
Sintáxis: [ Descargar ] [ Ocultar ]
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. }
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recorrer XML con atributos

Notapor dexposito » 2011-03-26 10:59 @499

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!
dexposito
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-03-26 06:22 @307

Re: Recorrer XML con atributos

Notapor explorer » 2011-03-26 11:07 @505

dexposito escribiste: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 & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Recorrer XML con atributos

Notapor dexposito » 2011-03-26 11:23 @516

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é.
dexposito
Perlero nuevo
Perlero nuevo
 
Mensajes: 11
Registrado: 2011-03-26 06:22 @307

Siguiente

Volver a Web

¿Quién está conectado?

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

cron