Oct 302012
 
Artículo Perl

( Read this post in english )

En nuestro anterior artículo hemos visto cómo podemos procesar un fichero en formato XML con el módulo CPAN XML::Simple.

Sin embargo, este módulo lee el fichero entero en memoria, por lo que no resulta adecuado cuando el fichero a procesar es muy grande y los recursos de memoria RAM de que disponemos son limitados.

En su lugar, podemos utilizar el módulo XML::Parse::PerlSAX (SAX: Simple API for XML). Conforme se va leyendo el fichero, este módulo genera eventos del tipo “comienza un elemento”, “finaliza un elemento”, etc. Para procesar estos eventos programamos un package manejador de eventos.

Ejemplo:

#!/usr/bin/perl
#
use strict;
use warnings;

use XML::Parser::PerlSAX;
# Creamos una instancia del Parser, pasandole como argumento
# una instancia del manejador de eventos "LectorXML" que vamos
# a implementar
my $parser = XML::Parser::PerlSAX->new( Handler => LectorXML->new( ) );

my $fichero = "clientes.xml";
$parser->parse( Source => {SystemId => $fichero} );
exit;

En el package “LectorXML” implementamos los métodos “start_element”, “end_element” y “characters” para procesar los correspondientes eventos:

###
### Package manejador de eventos XML LectorXML
###
package LectorXML;

#
# inicialización
#
sub new {
    my $tipo = shift;
    return bless {}, $tipo;
}

#
# al recibir un evento start-of-element, imprime el tag de apertura
# y los atributos del elemento
sub start_element {
    my( $self, $propiedades ) = @_;
    # nota: al recibir los atributos en el hash %{$propiedades} se
    # pierde el orden en el que se encontraban en el fichero leido

    print "<" . $propiedades->{'Name'};
    my %atributos = %{$propiedades->{'Attributes'}};
    foreach( keys( %atributos )) {
        print " $_="" . $atributos{$_} . """;
    }
    print ">";
} 

#
# al recibir un evento end-of-element, imprime el tag de cierre
#
sub end_element {
    my( $self, $propiedades ) = @_;
    print "</" . $propiedades->{'Name'} . ">";
}

#
# Al recibir datos de texto, imprimelos
# Para generar XML válido, debemos convertir determinados caracteres
# en secuencias de escape: Por ejemplo, '<' se convierte en '&lt;'
#
sub characters {
    my( $self, $properties ) = @_;
    my $data = $properties->{'Data'};
    $data =~ s/&/&/;
    $data =~ s/</&lt;/;
    $data =~ s/>/&gt;/;
    print $data;
}

Si ejecutamos este programa de ejemplo para leer el fichero “clientes.xml” que utilizamos en nuestro anterior artículo, obtenemos el siguiente resultado:

<clientes timestamp="2002-05-13 15:33:45" version="3.5">
 <cliente identificador="62520">
  <nombre>Juan</nombre>
  <apellido>Fernandez</apellido>
  <direccion>
    <calle>Avda. Ilustración 17</calle>
    <poblacion>Guadalajara</poblacion>
    <provincia>Guadalajara</provincia>
    <cp>82649</cp>
  </direccion>
  <email>juan.fernandez@expensive-mail.org</email>
  <edad>42</edad>
 </cliente>
 <cliente identificador="62521">
  <nombre>Elena</nombre>
  <apellido>Rovira</apellido>
   <direccion>
    <calle>Pez Volador 2</calle>
    <poblacion>Móstoles</poblacion>
    <provincia>Madrid</provincia>
    <cp>28001</cp>
   </direccion>
   <email>elerovw@cyb.org</email>
   <edad>37</edad>
  </cliente>
</clientes>

Indice de artículos sobre programación en lenguaje Perl

 Publicado por en 8:18 pm

 Deja un comentario

(requerido)

(requerido)