Jue Jun 05, 2008 1:33 pm
|
|
|
| LibXML simple |
|
|
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 |
|
|
|

Jue Jun 05, 2008 4:39 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4222
Ubicación: Valladolid, España
|
|
|
|
|
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'. |
|

Powered by phpBB © 2001, 2005 phpBB Group
|