Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

XPath

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Jue Jun 19, 2008 4:18 am
xagutxu_perez
Perlero Nuevo
Perlero Nuevo
Registrado: 04 Abr 2008
Mensajes: 40
XPath Responder citando

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:

HTML:
<?xml version="1.0" encoding="iso-8859-1"?>
<tokens>
  <w id="w1" tokentype="HAS_MAI">
    <forma>Baina</forma>
    <anbtal talde_zenb="13">
      <tamaina>002</tamaina>
    </anbtal>
  </w>
  <w id="w2">
  ...
  </w>
</tokens>


Hago:

Perl:
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");
                }
        }
}


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
Mensaje Jue Jun 19, 2008 4:56 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3893
Ubicación: Valladolid, España
Responder citando

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 '.'.
Mensaje Jue Jun 19, 2008 6:45 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1361
Ubicación: México
Responder citando

O también lo puedes sustituir por:

Perl:
qq|//w[\@id="$iden_00"]|
Mensaje Jue Jun 19, 2008 7:00 am
xagutxu_perez
Perlero Nuevo
Perlero Nuevo
Registrado: 04 Abr 2008
Mensajes: 40
Responder citando

¡¡¡Muchas gracias!!!

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

Xagutxu
Mensaje Jue Jun 19, 2008 12:45 pm
xagutxu_perez
Perlero Nuevo
Perlero Nuevo
Registrado: 04 Abr 2008
Mensajes: 40
y para el @id? Responder citando

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

Perl:
foreach my $word ($root->findnodes("//w[@id=\"$iden_00\"]")){
...
}


Poniendo, igualmente:

Perl:
foreach my $word ($root->findnodes("//w[@\"id\"=\"$iden_00\"]")){
...
}


No funciona...

Gracias,

Xagutxu
Mensaje Jue Jun 19, 2008 12:56 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 3893
Ubicación: Valladolid, España
Responder citando

"//w[\@$id=\"$iden_00\"]", siendo $id el valor de id.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group