Perl en Español

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

LibXML simple

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Básico
Mensaje Jue Jun 05, 2008 1:33 pm
xagutxu_perez
Perlero Nuevo
Perlero Nuevo
Registrado: 04 Abr 2008
Mensajes: 43
LibXML simple Responder citando

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:

XML:
<?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">
    ...


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

Perl:
#!/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........
                }
}


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

Perl:
     $num_grupo = $word->getAttribute(num_grupo);


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
Mensaje Jue Jun 05, 2008 4:39 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
Responder citando

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

Perl:
#!/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";
}
Aquí hacemos una búsqueda directa del nodo que se llame 'anbtal'.
Perl:
#!/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";
}
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'.
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