• Publicidad

Consulta de XML::Simple

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

Consulta de XML::Simple

Notapor seguridadenmimail » 2011-12-13 14:47 @657

Estimados,
Estoy teniendo problemas con un parser.

Tengo el siguiente XML:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <gpx>
  3.   <wpt lat="" lon="">
  4.     <ele>0</ele>
  5.     <time>1-01-01T00:00:0.0Z</time>
  6.     <geoidheight>0</geoidheight>
  7.     <name> [00:00:00:00:00:00]</name>
  8.     <cmt>0</cmt>
  9.     <desc>
  10. [00:00:00:00:00:00]
  11. RSSI: -46 dB
  12. Quality: 100%
  13. Channel 1
  14. Speed (kph): 0
  15. 1-01-01T00:00:0.0Z</desc>
  16.     <fix></fix>
  17.     <sat>0</sat>
  18.     <hdop>0</hdop>
  19.     <vdop>0</vdop>
  20.     <pdop>0</pdop>
  21.     <extensions>
  22.       <MAC>00:00:00:00:00:00</MAC>
  23.       <SSID>PRUEBA</SSID>
  24.       <RSSI>-46</RSSI>
  25.       <ChannelID>1</ChannelID>
  26.       <privacy>RSNA-CCMP</privacy>
  27.       <signalQuality>100</signalQuality>
  28.       <networkType>Infrastructure</networkType>
  29.       <rates>1/2/5,5/6/9/11/12/18/24/36/48/54</rates>
  30.     </extensions>
  31.   </wpt>
  32.  </gpx>
  33.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Quiero obtener como resultado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
- SSID
- MAC
- RSSI
- ChannelID
- networkType
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Mi script es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use XML::Simple;
  6. use Data::Dumper;
  7.  
  8. my $info = XMLin("kk.xml", KeyAttr => 1);
  9. print Dumper($info);
  10.  
  11. for my $ap ( @{$info->{extensions}} ) {
  12.         print "$ap->{SSID} => $ap->{MAC} ($ap->{RSSI})\n";
  13. }
  14.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


No me funciona :S
seguridadenmimail
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2011-08-30 19:28 @853

Publicidad

Re: Consulta de XML::Simple

Notapor explorer » 2011-12-13 17:42 @779

El acceso no era correcto. 'extensions' está dentro de 'wpt'. Y el bucle recorre un hash, no un array.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use XML::Simple;
  6. use Data::Dumper;
  7.  
  8. my $info = XMLin("code_28964.xml", KeyAttr => 1);
  9. print Dumper($info);
  10.  
  11. my $extensions_ref = $info->{wpt}->{extensions};
  12.  
  13. for my $ap ( keys %{$extensions_ref} ) {
  14.     print "$ap => $extensions_ref->{$ap}\n";
  15. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
networkType => Infrastructure
rates => 1/2/5,5/6/9/11/12/18/24/36/48/54
SSID => PRUEBA
MAC => 00:00:00:00:00:00
signalQuality => 100
RSSI => -46
ChannelID => 1
privacy => RSNA-CCMP
Coloreado en 0.000 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: Consulta de XML::Simple

Notapor seguridadenmimail » 2011-12-13 18:16 @803

En mi caso sigue mostrándome todos los datos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = {
          'wpt' => [
                   {
                     'vdop' => '0',
                     'ele' => '0',
                     'fix' => {},
                     'time' => '1-01-01T00:00:0.0Z',
                     'lat' => '',
                     'name' => ' [00:00:00:00:00]',
                     'hdop' => '0',
                     'cmt' => '0',
                     'geoidheight' => '0',
                     'extensions' => {
                                     'networkType' => 'Infrastructure',
                                     'rates' => '1/2/5,5/6/9/11/12/18/24/36/48/54',
                                     'SSID' => {PRUEBA},
                                     'MAC' => '00:00:00:00:00',
                                     'signalQuality' => '100',
                                     'RSSI' => '-46',
                                     'ChannelID' => '1',
                                     'privacy' => 'RSNA-CCMP'
                                   },
                     'pdop' => '0',
                     'desc' => '
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Por otro lado, ¿se puede hacer print() por separado? Ya que en un futuro voy a tratar de enviar esa información a un XLS...
seguridadenmimail
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2011-08-30 19:28 @853

Re: Consulta de XML::Simple

Notapor explorer » 2011-12-13 19:10 @840

Sí, claro que se puede...
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: Consulta de XML::Simple

Notapor explorer » 2011-12-13 19:13 @842

Hummm... interesante... tu volcado de datos es diferente del mío:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = {
          'wpt' => {
                   'vdop' => '0',
                   'ele' => '0',
                   'fix' => {},
                   'time' => '1-01-01T00:00:0.0Z',
                   'lat' => '',
                   'name' => ' [00:00:00:00:00:00]',
                   'hdop' => '0',
                   'cmt' => '0',
                   'geoidheight' => '0',
                   'extensions' => {
                                   'networkType' => 'Infrastructure',
                                   'rates' => '1/2/5,5/6/9/11/12/18/24/36/48/54',
                                   'SSID' => 'PRUEBA',
                                   'MAC' => '00:00:00:00:00:00',
                                   'signalQuality' => '100',
                                   'RSSI' => '-46',
                                   'ChannelID' => '1',
                                   'privacy' => 'RSNA-CCMP'
                                 },
                   'pdop' => '0',
                   'desc' => '
[00:00:00:00:00:00]
RSSI: -46 dB
Quality: 100%
Channel 1
Speed (kph): 0
1-01-01T00:00:0.0Z',
                   'sat' => '0',
                   'lon' => ''
                 }
        };
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Eso es porque no coinciden las versiones de XML::Simple (supongo).
En mi caso yo estoy con la v2.18:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. explorer@casa:~/Documentos/Desarrollo> perl -MXML::Simple -E 'say $XML::Simple::VERSION'
  2. 2.18
Coloreado en 0.004 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: Consulta de XML::Simple

Notapor explorer » 2011-12-13 19:14 @843

Para tu organización de datos, sería suficiente con modificar esta línea:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $extensions_ref = $info->{wpt}->[0]->{extensions};
Coloreado en 0.001 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: Consulta de XML::Simple

Notapor seguridadenmimail » 2011-12-13 19:20 @847

Hice el cambio y me da el mismo resultado :S

Mi versión es la misma que la tuya, estoy corriendo Perl en Windows Seven.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. C:\>perl -MXML::Simple -E "say $XML::Simple::VERSION"
  2. 2.18
  3.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Es como si hace un DUMP de todo, sin realizar el "parseo".
seguridadenmimail
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2011-08-30 19:28 @853

Re: Consulta de XML::Simple

Notapor explorer » 2011-12-13 20:21 @889

La interpretación (parseo) es correcta.

Dumper() muestra lo que ha leído XML::Simple.

La diferencia entre tu salida y la mía es que en la tuya, los contenidos de 'wpt' están en un array anónimo (el corchete '[' que aparece en el volcado), y por eso puse ->[0] en la solución para tu salida.

Prueba con ese cambio, debería salir...
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: Consulta de XML::Simple

Notapor seguridadenmimail » 2011-12-14 05:16 @261

xml:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <gpx>
  3.   <wpt lat="" lon="">
  4.     <ele>0</ele>
  5.     <time>1-01-01T00:00:0.0Z</time>
  6.     <geoidheight>0</geoidheight>
  7.     <name>Mer2 [00:12:0E:03:02:01]</name>
  8.     <cmt>0</cmt>
  9.     <desc>Mer2
  10. [00:12:0E:03:02:01]
  11. RSSI: -81 dB
  12. Quality: 65%
  13. Channel 11
  14. Speed (kph): 0
  15. 1-01-01T00:00:0.0Z</desc>
  16.     <fix></fix>
  17.     <sat>0</sat>
  18.     <hdop>0</hdop>
  19.     <vdop>0</vdop>
  20.     <pdop>0</pdop>
  21.     <extensions>
  22.       <MAC>00:12:0E:03:02:01</MAC>
  23.       <SSID>Mer2</SSID>
  24.       <RSSI>-81</RSSI>
  25.       <ChannelID>11</ChannelID>
  26.       <privacy>None</privacy>
  27.       <signalQuality>65</signalQuality>
  28.       <networkType>Infrastructure</networkType>
  29.       <rates>1/2/5,5/6/9/11/12/18/24/36/48/54</rates>
  30.     </extensions>
  31.   </wpt>
  32.   <wpt lat="" lon="">
  33.     <ele>0</ele>
  34.     <time>1-01-01T00:00:0.0Z</time>
  35.     <geoidheight>0</geoidheight>
  36.     <name>chapo1[1C:BD:00:00:00:00]</name>
  37.     <cmt>0</cmt>
  38.     <desc>chapo1
  39. [1C:BD:00:00:00:00]
  40. RSSI: -87 dB
  41. Quality: 21%
  42. Channel 11
  43. Speed (kph): 0
  44. 1-01-01T00:00:0.0Z</desc>
  45.     <fix></fix>
  46.     <sat>0</sat>
  47.     <hdop>0</hdop>
  48.     <vdop>0</vdop>
  49.     <pdop>0</pdop>
  50.     <extensions>
  51.       <MAC>1C:BD:00:00:00:00</MAC>
  52.       <SSID>chapo1</SSID>
  53.       <RSSI>-87</RSSI>
  54.       <ChannelID>11</ChannelID>
  55.       <privacy>RSNA-CCMP</privacy>
  56.       <signalQuality>21</signalQuality>
  57.       <networkType>Infrastructure</networkType>
  58.       <rates>1/2/5,5/6/9/11/12/15/18/24/30/36/45/48/54/60/90/120/135/150</rates>
  59.     </extensions>
  60.   </wpt>
  61.   <wpt lat="" lon="">
  62.     <ele>0</ele>
  63.     <time>1-01-01T00:00:0.0Z</time>
  64.     <geoidheight>0</geoidheight>
  65.     <name>Mer1 [00:12:00:00:00:00]</name>
  66.     <cmt>0</cmt>
  67.     <desc>Mer1
  68. [00:12:00:00:00:00]
  69. RSSI: -61 dB
  70. Quality: 65%
  71. Channel 11
  72. Speed (kph): 0
  73. 1-01-01T00:00:0.0Z</desc>
  74.     <fix></fix>
  75.     <sat>0</sat>
  76.     <hdop>0</hdop>
  77.     <vdop>0</vdop>
  78.     <pdop>0</pdop>
  79.     <extensions>
  80.       <MAC>00:12:00:00:00:00</MAC>
  81.       <SSID>Mer1</SSID>
  82.       <RSSI>-61</RSSI>
  83.       <ChannelID>11</ChannelID>
  84.       <privacy>None</privacy>
  85.       <signalQuality>65</signalQuality>
  86.       <networkType>Infrastructure</networkType>
  87.       <rates>1/2/5,5/6/9/11/12/18/24/36/48/54</rates>
  88.     </extensions>
  89.   </wpt>
  90. </gpx>
  91.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use XML::Simple;
  6. use Data::Dumper;
  7.  
  8. my $info = XMLin("1.xml", KeyAttr => 1);
  9. print Dumper($info);
  10.  
  11. my $extensions_ref = $info->{'wpt'}[0]->{'extensions'};
  12.  
  13. for my $ap ( keys %{$extensions_ref} ) {
  14.     print "$ap => $extensions_ref->{$ap}\n";
  15. }
  16.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


output:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $VAR1 = {
  2.           'wpt' => [
  3.                    {
  4.                      'vdop' => '0',
  5.                      'ele' => '0',
  6.                      'fix' => {},
  7.                      'time' => '1-01-01T00:00:0.0Z',
  8.                      'lat' => '',
  9.                      'name' => 'Mer2 [00:12:0E:03:02:01]',
  10.                      'hdop' => '0',
  11.                      'cmt' => '0',
  12.                      'geoidheight' => '0',
  13.                      'extensions' => {
  14.                                      'networkType' => 'Infrastructure',
  15.                                      'rates' => '1/2/5,5/6/9/11/12/18/24/36/48/54',
  16.                                      'SSID' => 'Mer2',
  17.                                      'MAC' => '00:12:0E:03:02:01',
  18.                                      'signalQuality' => '65',
  19.                                      'RSSI' => '-81',
  20.                                      'ChannelID' => '11',
  21.                                      'privacy' => 'None'
  22.                                    },
  23.                      'pdop' => '0',
  24.                      'desc' => 'Mer2
  25. [00:12:0E:03:02:01]
  26. RSSI: -81 dB
  27. Quality: 65%
  28. Channel 11
  29. Speed (kph): 0
  30. 1-01-01T00:00:0.0Z',
  31.                      'sat' => '0',
  32.                      'lon' => ''
  33.                    },
  34.                    {
  35.                      'vdop' => '0',
  36.                      'ele' => '0',
  37.                      'fix' => {},
  38.                      'time' => '1-01-01T00:00:0.0Z',
  39.                      'lat' => '',
  40.                      'name' => 'chapo1[1C:BD:00:00:00:00]',
  41.                      'hdop' => '0',
  42.                      'cmt' => '0',
  43.                      'geoidheight' => '0',
  44.                      'extensions' => {
  45.                                      'networkType' => 'Infrastructure',
  46.                                      'rates' => '1/2/5,5/6/9/11/12/15/18/24/30/36/45/48/54/60/90/120/135/150',
  47.                                      'SSID' => 'chapo1',
  48.                                      'MAC' => '1C:BD:00:00:00:00',
  49.                                      'signalQuality' => '21',
  50.                                      'RSSI' => '-87',
  51.                                      'ChannelID' => '11',
  52.                                      'privacy' => 'RSNA-CCMP'
  53.                                    },
  54.                      'pdop' => '0',
  55.                      'desc' => 'chapo1
  56. [1C:BD:00:00:00:00]
  57. RSSI: -87 dB
  58. Quality: 21%
  59. Channel 11
  60. Speed (kph): 0
  61. 1-01-01T00:00:0.0Z',
  62.                      'sat' => '0',
  63.                      'lon' => ''
  64.                    },
  65.                    {
  66.                      'vdop' => '0',
  67.                      'ele' => '0',
  68.                      'fix' => {},
  69.                      'time' => '1-01-01T00:00:0.0Z',
  70.                      'lat' => '',
  71.                      'name' => 'Mer1 [00:12:00:00:00:00]',
  72.                      'hdop' => '0',
  73.                      'cmt' => '0',
  74.                      'geoidheight' => '0',
  75.                      'extensions' => {
  76.                                      'networkType' => 'Infrastructure',
  77.                                      'rates' => '1/2/5,5/6/9/11/12/18/24/36/48/54',
  78.                                      'SSID' => 'Mer1',
  79.                                      'MAC' => '00:12:00:00:00:00',
  80.                                      'signalQuality' => '65',
  81.                                      'RSSI' => '-61',
  82.                                      'ChannelID' => '11',
  83.                                      'privacy' => 'None'
  84.                                    },
  85.                      'pdop' => '0',
  86.                      'desc' => 'Mer1
  87. [00:12:00:00:00:00]
  88. RSSI: -61 dB
  89. Quality: 65%
  90. Channel 11
  91. Speed (kph): 0
  92. 1-01-01T00:00:0.0Z',
  93.                      'sat' => '0',
  94.                      'lon' => ''
  95.                    }
  96.                  ]
  97.         };
  98. networkType => Infrastructure
  99. rates => 1/2/5,5/6/9/11/12/18/24/36/48/54
  100. SSID => Mer2
  101. MAC => 00:12:0E:03:02:01
  102. signalQuality => 65
  103. RSSI => -81
  104. ChannelID => 11
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
seguridadenmimail
Perlero nuevo
Perlero nuevo
 
Mensajes: 69
Registrado: 2011-08-30 19:28 @853

Re: Consulta de XML::Simple

Notapor explorer » 2011-12-14 07:09 @339

¡Ah, claro!

Como no habías puesto el XML entero, no sabía el porqué XML::Simple había convertido en array los contenidos de 'wpt'. Viéndolo completo, nos damos cuenta de que tiene varias entradas.

Bueno, pues entonces sí, haciendo variar el índice dentro de los corchetes, de la línea 11, accedes a todos los contenidos.

Ya solo te queda quitar o comentar la línea 9 para que no te haga el volcado de datos, y listo.

P.D. Estamos en el foro Intermedio.
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

Siguiente

Volver a Básico

¿Quién está conectado?

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