• Publicidad

Tratamiento de log XML

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

Tratamiento de log XML

Notapor Davide » 2011-07-05 04:21 @223

Buenas a todos, tengo una utilidad que genera un registro en un log XML con el siguiente aspecto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="ISO8859-1" ?>
  2. <?xml-stylesheet type="text/xsl" href="drivers.xsl"?>
  3. <table>
  4.  
  5.         <driver name="Driver1">
  6.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  7.                 <data field="Start Option">Manual</data>
  8.                 <data field="Status">RUNNING</data>
  9.                 <data field="TOA File">/33086.drv</data>
  10.                 <data field="Size"></data>
  11.         </driver>
  12.         <driver name="Driver2">
  13.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  14.                 <data field="Start Option">Disabled</data>
  15.                 <data field="Status">DISABLED</data>
  16.                 <data field="TOA File">/33003.drv</data>
  17.                 <data field="Size"></data>
  18.         </driver>
  19.         <driver name="Driver2">
  20.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  21.                 <data field="Start Option">Manual</data>
  22.                 <data field="Status">STOPPED</data>
  23.                 <data field="TOA File">/33027.drv</data>
  24.                 <data field="Size"></data>
  25.         </driver>
  26.         <driver name="Driver3">
  27.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  28.                 <data field="Start Option">Manual</data>
  29.                 <data field="Status">RUNNING</data>
  30.                 <data field="TOA File">/33125.drv</data>
  31.                 <data field="Size"></data>
  32.         </driver>
  33.         <driver name="Driver4">
  34.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  35.                 <data field="Start Option">Manual</data>
  36.                 <data field="Status">RUNNING</data>
  37.                 <data field="TOA File">/33118.drv</data>
  38.                 <data field="Size"></data>
  39.         </driver>
  40.         <driver name="Driver5">
  41.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  42.                 <data field="Start Option">Manual</data>
  43.                 <data field="Status">RUNNING</data>
  44.                 <data field="TOA File">/33182.drv</data>
  45.                 <data field="Size"></data>
  46.         </driver>
  47.         <driver name="Driver6">
  48.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  49.                 <data field="Start Option">Manual</data>
  50.                 <data field="Status">RUNNING</data>
  51.                 <data field="TOA File">/33065.drv</data>
  52.                 <data field="Size"></data>
  53.         </driver>
  54.         <driver name="Driver7">
  55.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  56.                 <data field="Start Option">Manual</data>
  57.                 <data field="Status">RUNNING</data>
  58.                 <data field="TOA File">/33045.drv</data>
  59.                 <data field="Size"></data>
  60.         </driver>
  61.         <driver name="Driver8">
  62.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  63.                 <data field="Start Option">Disabled</data>
  64.                 <data field="Status">DISABLED</data>
  65.                 <data field="TOA File">/134355.drv</data>
  66.                 <data field="Size"></data>
  67.         </driver>
  68.         <driver name="Driver9">
  69.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  70.                 <data field="Start Option">Disabled</data>
  71.                 <data field="Status">DISABLED</data>
  72.                 <data field="TOA File">/33220.drv</data>
  73.                 <data field="Size"></data>
  74.         </driver>
  75.         <driver name="Driver 10">
  76.                 <data field="Timestamp">2011:07:05 10:30:01</data>
  77.                 <data field="Start Option">Manual</data>
  78.                 <data field="Status">RUNNING</data>
  79.                 <data field="TOA File">/32984.drv</data>
  80.                 <data field="Size"></data>
  81.         </driver>
  82. </table>
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


La idea es tratar ese texto para ir añadiendo nuevas líneas en otro fichero. Cada nueva línea tiene que corresponderse con los campos contenidos dentro del tag <driver...> </driver>. Tendría que ser algo parecido a esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Driver1,2011:07:05 10:30:01,Manual,RUNNING,/33086.drv,
Driver2,2011:07:05 10:30:01,Disabled,DISABLED,/33003.drv,
.
.
.
.
Driver 10,2011:07:05 10:30:01,Manual,RUNNING,/32984.drv,
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Si alguien me pudiera ayudar con ello se lo agradecería.

Saludos.
Davide
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-07-05 04:04 @211

Publicidad

Re: Tratamiento de log XML

Notapor explorer » 2011-07-05 12:36 @567

Bienvenido a los foros de Perl en español, Davide.

Con el siguiente programa,
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use 5.010;
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6. use autodie;
  7.  
  8. my (
  9.     $name,      $timestamp,     $start,
  10.     $status,    $toa,           $size,
  11. );
  12.  
  13. open my $XML, q[<], 'code_26957.xml';
  14. open my $OUT, q[>], 'code_26957.out';
  15.  
  16. while (my $linea = <$XML>) {
  17.  
  18.     given ($linea) {
  19.         when (/<driver name="(.*?)"/) {
  20.             $name      = $1;
  21.         }
  22.         when (/field="Timestamp">(.*?)</) {
  23.             $timestamp = $1;
  24.         }
  25.         when (/field="Start Option">(.*?)</) {
  26.             $start     = $1;
  27.         }
  28.         when (/field="Status">(.*?)</) {
  29.             $status    = $1;
  30.         }
  31.         when (/field="TOA File">(.*?)</) {
  32.             $toa       = $1;
  33.         }
  34.         when (/field="Size">(.*?)</) {
  35.             $size      = $1;
  36.         }
  37.         when (/<\/driver>/) {
  38.             say $OUT
  39.                 join q[,],
  40.                         $name,  $timestamp,     $start,
  41.                         $status,$toa,           $size,
  42.             ;
  43.         }
  44.     }
  45. }
  46.  
  47. close   $XML;
  48. close   $OUT;
  49.  
  50. __END__
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
se obtiene la siguiente salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Driver1,2011:07:05 10:30:01,Manual,RUNNING,/33086.drv,
Driver2,2011:07:05 10:30:01,Disabled,DISABLED,/33003.drv,
Driver2,2011:07:05 10:30:01,Manual,STOPPED,/33027.drv,
Driver3,2011:07:05 10:30:01,Manual,RUNNING,/33125.drv,
Driver4,2011:07:05 10:30:01,Manual,RUNNING,/33118.drv,
Driver5,2011:07:05 10:30:01,Manual,RUNNING,/33182.drv,
Driver6,2011:07:05 10:30:01,Manual,RUNNING,/33065.drv,
Driver7,2011:07:05 10:30:01,Manual,RUNNING,/33045.drv,
Driver8,2011:07:05 10:30:01,Disabled,DISABLED,/134355.drv,
Driver9,2011:07:05 10:30:01,Disabled,DISABLED,/33220.drv,
Driver 10,2011:07:05 10:30:01,Manual,RUNNING,/32984.drv,
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Solo es una forma de hacerlo. Hay otras. Aquí hay otra un poco más corta, y más fácil de mantener si el fichero log cambia en el futuro:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5. use autodie;
  6.  
  7. my $driver;
  8. my @fields = ('Timestamp', 'Start Option', 'Status', 'TOA File', 'Size' );
  9. my %fields;
  10.  
  11. open my $XML, q[<], 'code_26957.xml';
  12. open my $OUT, q[>], 'code_26957.out';
  13.  
  14. while (my $linea = <$XML>) {
  15.  
  16.     if ($linea =~ /<driver name="(.*?)"/) {
  17.         $driver = $1;                           # nuevo driver
  18.         undef %fields;                          # reinicimos los campos
  19.         next;
  20.     }
  21.  
  22.     if ($linea =~ /<\/driver>/) {
  23.         print $OUT join(q[,], $driver, @fields{@fields}), "\n";
  24.         next;
  25.     }
  26.  
  27.     if ($linea =~ /field="(.+?)">(.*?)</) {      
  28.         $fields{$1} = $2;
  29.     }
  30. }
  31.  
  32. close   $XML;
  33. close   $OUT;
  34.  
  35. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Tratamiento de log XML

Notapor Davide » 2011-07-06 03:52 @202

Muchas gracias @explorer !!! Van como la seda. Escogí la segunda opción por si me modifican el XML en el futuro.

Prometo profundizar más en Perl y que en el futuro mis consultas no sean preguntar por un script completo.. y quién sabe si algún día responderé hasta las dudas de otros :D

Saludos.
Davide
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-07-05 04:04 @211


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados