• Publicidad

XPath

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

XPath

Notapor xagutxu_perez » 2008-06-19 05:18 @262

Hola a todos:

Estoy leyendo un documento en XML (parseado con LibXML), y tengo algún problemilla con XPath.

Suponiendo que una muestra del doc XML que tengo es:

Sintáxis: [ Descargar ] [ Ocultar ]
  1. <?xml version="1.0" encoding="iso-8859-1"?> 
  2. <tokens> 
  3. <w id="w1" tokentype="HAS_MAI"> 
  4. <forma>Baina</forma> 
  5. <anbtal talde_zenb="13"> 
  6. <tamaina>002</tamaina> 
  7. </anbtal> 
  8. </w> 
  9. <w id="w2"> 
  10. ... 
  11. </w> 
  12. </tokens> 


Hago:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use XML::LibXML;
use strict;

my $parser = XML::LibXML->new();
$parser->keep_blanks(0);
my $doc = $parser->parse_file("/home/file.xml");
my $root = $doc->getDocumentElement();

for (my $i = 1; $i < 100; $i ++){
        my $iden_00 = "w"."$i";
        foreach my $word ($root->findnodes('//w[@id="$iden_00"]')){
                foreach my $anbtal ($word->findnodes("anbtal")){
                        $talde_zenb_00 = $anbtal->getAttribute("talde_zenb");
                        $tamaina_00 = $anbtal->findnodes("tamaina");
                }
        }
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Y no me lee $talde_zen_00 ni $tamaina_00. Lo curioso es que en la parte de XPath, si pongo, por ejemplo "w3" en vez de la variable "$iden_00":

foreach my $word ($root->findnodes('//w[@id="w3"]')){
...

Sí que lee. No sé si la cuestión está en las comillas...

Gracias como siempre,

Xagutxu
xagutxu_perez
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2008-04-04 03:56 @206

Publicidad

Notapor explorer » 2008-06-19 05:56 @289

Sí, pueden ser las comillas. Las comillas simples impiden la expansión de las variables que existan dentro.

Cambia
'//w[@id="$iden_00"]' por
'//w[@id="' . $iden_00 . '"]' o por
"//w[\@id=\"$iden_00\"]" o por
"//w[\@id='$iden_00']".

Como ves, la dificultad está en que además de la variable $ident_00, Perl puede pensar que @id es otra variable, por lo que no podemos hacer una expansión normal.

Yo elegiría la opción de concatenación con el operador '.'.
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

Notapor kidd » 2008-06-19 07:45 @364

O también lo puedes sustituir por:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
qq|//w[\@id="$iden_00"]|
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor xagutxu_perez » 2008-06-19 08:00 @375

¡¡¡Muchas gracias!!!

No sé qué haría sin vosotros...

Xagutxu
xagutxu_perez
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2008-04-04 03:56 @206

y para el @id?

Notapor xagutxu_perez » 2008-06-19 13:45 @614

¿Y si lo que quiero es sustituir el @id por una variable, cómo se haría?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $word ($root->findnodes("//w[@id=\"$iden_00\"]")){
...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Poniendo, igualmente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach my $word ($root->findnodes("//w[@\"id\"=\"$iden_00\"]")){
...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


No funciona...

Gracias,

Xagutxu
xagutxu_perez
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2008-04-04 03:56 @206

Notapor explorer » 2008-06-19 13:56 @622

"//w[\@$id=\"$iden_00\"]", siendo $id el valor de id.
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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 2 invitados

cron