• Publicidad

LibXML simple

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

LibXML simple

Notapor xagutxu_perez » 2008-06-05 14:33 @648

Hola a todos:

Tengo que hacer un pequeño trabajo con el módulo LibXML; es una cuestión muy simple, a ver si alguien me puede echar una manita...

Tengo un fichero XML de la forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<?xml version="1.0" encoding="iso-8859-1"?>
<tokens>
  <w id="w1" tokentype="DEN_MAI">
    <forma>MARIA</forma>
    <anbtal num_grupo="5664">
      <tamaina>006</tamaina>
    </anbtal>
    <ana>
      <lema>Maria</lema>
      <kat>IZE</kat>
      <azp>IZB</azp>
    </ana>
  </w>
  <w id ="w2">
    ...
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Para utilizar LibXML, creo un parser y leo el fichero:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/local/bin/perl
use XML::LibXML;
use strict;

my $parser = XML::LibXML->new();        # Creo el parser
$parser->keep_blanks(0);                # Pasa de los espacios en blanco

my $num_grupo;

# Leo el fichero

my $doc = $parser->parse_file("/home/fichero/prueba.xml");
my $root = $doc->getDocumentElement();

# Quiero quedarme solo con los elem de atributo num_grupo="20":
my $numero = 20;

foreach my $word ($root->findnodes("//w")){
               
                $num_grupo = $word->getAttribute(num_grupo);
                if ($num_grupo == $numero)
                {
                         # etc........
                }
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


El problema está, efectivamente, en la línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
     $num_grupo = $word->getAttribute(num_grupo);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ya que <w> no tiene ningún atributo de nombre "num_grupo". ¿Cómo puedo acceder, entonces, a los atributos de los hijos de <w> (en este caso, de "anbtal")?

Gracias (como siempre),

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

Publicidad

Notapor explorer » 2008-06-05 17:39 @777

Aquí tienes dos ejemplos para acceder al nodo 'anbtal'.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use XML::LibXML;
use strict;

my $parser = XML::LibXML->new();        # Creo el parser
$parser->keep_blanks(0);                # Pasa de los espacios en blanco

# Leo el fichero y lo parseo
my $doc = $parser->parse_file("kk.xml");

# Localización directa de los nodos 'anbtal'
foreach my $anbtal ( $doc->getElementsByTagName('anbtal') ) {
    print $anbtal->getAttribute('num_grupo'), "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Aquí hacemos una búsqueda directa del nodo que se llame 'anbtal'.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use XML::LibXML;
use strict;

my $parser = XML::LibXML->new();        # Creo el parser
$parser->keep_blanks(0);                # Pasa de los espacios en blanco

# Leo el fichero y lo parseo
my $doc = $parser->parse_file("kk.xml");

# Localización siguiendo la ruta de los nodos
my $nodos = $doc->findnodes("//w");
foreach my $nodo ( $nodos->get_nodelist ) {
    my $anbtal = ($nodo->getChildrenByTagName('anbtal'))[0];
    print $anbtal->getAttribute('num_grupo'), "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Aquí hacemos algo distinto:
* Buscamos (findnodes) todos los nodos correspondientes al XPath '//w'
* Por cada uno, obtenemos el primer ([0]) nodo hijo que se llame 'anbtal'. (getChildrenByTagName nos devuelve una lista de nodos, pero como sabemos que solo existe uno, pues nos quedamos con el primero de ellos, que, será el único).
* De ese nodo, pintamos el atributo 'num_grupo'.
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 0 invitados

cron