2011-03-26 06:28 @311 |
|
|
dexposito
Perlero Nuevo
|
Registrado: 2011-03-26 06:22 @307 Mensajes: 11
|
|
|
Recorrer XML con atributos
|
Hola. Pretendo recorrer este XML: Using xml Syntax Highlighting <eSummaryResult>
<DocSum>
<Id>1001445</Id>
<Item Name="PubDate" Type="Date">1976 Dec 1</Item>
<Item Name="EPubDate" Type="Date"/>
<Item Name="Source" Type="String">FEBS Lett</Item>
<Item Name="AuthorList" Type="List">
<Item Name="Author" Type="String">Chauvet MT</Item>
<Item Name="Author" Type="String">Codogno P</Item>
<Item Name="Author" Type="String">Chauvet J</Item>
<Item Name="Author" Type="String">Acher R</Item>
</Item>
<Item Name="LastAuthor" Type="String">Acher R</Item>
<Item Name="Title" Type="String">Characterization of porcine MSEL-neurophysin.</Item>
<Item Name="Volume" Type="String">71</Item>
<Item Name="Issue" Type="String">2</Item>
<Item Name="Pages" Type="String">291-3</Item>
<Item Name="LangList" Type="List">
<Item Name="Lang" Type="String">English</Item>
</Item>
<Item Name="NlmUniqueID" Type="String">0155157</Item>
<Item Name="ISSN" Type="String">0014-5793</Item>
<Item Name="ESSN" Type="String">1873-3468</Item>
<Item Name="PubTypeList" Type="List">
<Item Name="PubType" Type="String">Journal Article</Item>
</Item>
<Item Name="RecordStatus" Type="String">PubMed - indexed for MEDLINE</Item>
<Item Name="PubStatus" Type="String">ppublish</Item>
<Item Name="ArticleIds" Type="List">
<Item Name="pubmed" Type="String">1001445</Item>
<Item Name="pii" Type="String">0014-5793(76)80953-2</Item>
</Item>
<Item Name="History" Type="List">
<Item Name="pubmed" Type="Date">1976/12/01 00:00</Item>
<Item Name="medline" Type="Date">1976/12/01 00:01</Item>
<Item Name="entrez" Type="Date">1976/12/01 00:00</Item>
</Item>
<Item Name="References" Type="List"/>
<Item Name="HasAbstract" Type="Integer">0</Item>
<Item Name="PmcRefCount" Type="Integer">1</Item>
<Item Name="FullJournalName" Type="String">FEBS letters</Item>
<Item Name="ELocationID" Type="String"/>
<Item Name="SO" Type="String">1976 Dec 1;71(2):291-3</Item>
</DocSum>
<DocSum>
<Id>100152</Id>
<Item Name="PubDate" Type="Date">1978 Nov</Item>
<Item Name="EPubDate" Type="Date"/>
<Item Name="Source" Type="String">Blood</Item>
<Item Name="AuthorList" Type="List">
<Item Name="Author" Type="String">Borgers M</Item>
<Item Name="Author" Type="String">Verhaegen H</Item>
<Item Name="Author" Type="String">De Brabander M</Item>
</Item>
<Item Name="LastAuthor" Type="String">Geuens G</Item>
<Item Name="Title" Type="String">Purine nucleoside phosphorylase in chronic lymphocytic leukemia (CLL).</Item>
</DocSum>
</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?
|
2011-03-26 08:35 @399 |
|
|
dexposito
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.
|
2011-03-26 08:59 @416 |
|
|
 |
explorer
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) Using perl Syntax Highlighting #!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use XML::Trivial ();
my $xml = XML::Trivial::parseFile('code_25189.xml');
my @docsum = $xml->{eSummaryResult}->ea;
for my $docsum (0 .. @docsum-1) {
print "Id: ", $xml->{eSummaryResult}->{$docsum}->{Id}->ta, "\n";
for my $item ($xml->{eSummaryResult}->{$docsum}->ea) {
if ($item->en eq 'Item' and $item->ah('Name') eq 'Title') {
print "\tTitle: ", $item->ta, "\n";
}
}
}
_________________ JF^D Perl programming
|
2011-03-26 09:18 @429 |
|
|
dexposito
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);
|
2011-03-26 10:14 @468 |
|
|
dexposito
Perlero Nuevo
|
Registrado: 2011-03-26 06:22 @307 Mensajes: 11
|
|
|
Re: Recorrer XML con atributos
|
Esto es que lo que tengo: Using perl Syntax Highlighting $pubID = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=". $pubID;
my $respuesta = get( $pubID );
#my $DocSum = XMLin($respuesta);
my $doc = $parser->parsefile($respuesta);
foreach my $DocSum ($doc->getElementsByTagName('DocSum')){
print $DocSum->getElementsByTagName('Id');
print "\n";
}
Me da error cuando intenta hacer my $doc = $parser->parsefile($respuesta);y me dice: No such file or directory at actPub.pl line 47que 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.
|
2011-03-26 10:58 @498 |
|
|
 |
explorer
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. Using perl Syntax Highlighting #!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use XML::Smart;
my $pubIP = 1;
my $xml = XML::Smart->new("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=$pubID");
for my $docsum ( @{$xml->{eSummaryResult}->{DocSum}} ) {
print $docsum->{Id} , " ", $docsum->{Item}('Name', 'eq', 'Title'), "\n";
}
_________________ JF^D Perl programming
|
2011-03-26 10:59 @499 |
|
|
dexposito
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!
|
2011-03-26 11:07 @505 |
|
|
 |
explorer
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
|
2011-03-26 11:23 @516 |
|
|
dexposito
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é.
|
2011-03-26 12:31 @563 |
|
|
 |
explorer
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: Using perl Syntax Highlighting #!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use XML::Simple;
use LWP::Simple;
my $pubID = 1;
my $pagina = get("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id=$pubID");
my $xml = XMLin($pagina, ForceArray => [ 'DocSum', 'Item' ], ForceContent => 1);
for my $docsum ( @{ $xml->{DocSum} } ) {
print "Id: ", $docsum->{'Id'}->{'content'}, " : ";
for my $item ( @{ $docsum->{Item} } ) {
next if $item->{'Name'} ne 'Title';
print $item->{'content'};
}
print "\n";
}
_________________ JF^D Perl programming
|
2011-04-23 10:59 @499 |
|
|
dexposito
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: Using perl Syntax Highlighting $pubID
= "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=gene&id="
. $pubID;
#my $pubIP = 1;
my $xml = XML::Smart->new($pubID);
my $sth1;
my $alias;
for my $docsum ( @{ $xml->{eSummaryResult}->{DocSum} } ) {
print $docsum->{Id}, "\n";
$alias = $docsum->{Item}( 'Name', 'eq', 'OtherAliases' );
$sth1
= $dbh->prepare('UPDATE gene_info_21 SET Alias = ? WHERE GeneID = ?')
or die( "Couldn't prepare statement: " . $dbh->errstr );
$sth1->execute( $alias, $docsum->{Id} )
or die( "Couldn't execute statement: " . $sth1->errstr );
}
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 |
|
2011-04-23 13:22 @598 |
|
|
 |
explorer
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
|
2011-04-30 08:29 @395 |
|
|
dexposito
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? Using perl Syntax Highlighting try {
my $xml=XML::Smart->new($pubID);
} catch {
print FILE "Error XML";
}
¿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.
|
| 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
|
|
Socializa |
 |
|