2011-12-13 14:47 @657 |
|
|
|
|
|
Consulta de XML::Simple RESUELTO
|
Estimados, Estoy teniendo problemas con un parser. Tengo el siguiente XML: Using xml Syntax Highlighting <?xml version="1.0" encoding="utf-8"?>
<gpx>
<wpt lat="" lon="">
<ele>0</ele>
<time>1-01-01T00:00:0.0Z</time>
<geoidheight>0</geoidheight>
<name> [00:00:00:00:00:00]</name>
<cmt>0</cmt>
<desc>
[00:00:00:00:00:00]
RSSI: -46 dB
Quality: 100%
Channel 1
Speed (kph): 0
1-01-01T00:00:0.0Z</desc>
<fix></fix>
<sat>0</sat>
<hdop>0</hdop>
<vdop>0</vdop>
<pdop>0</pdop>
<extensions>
<MAC>00:00:00:00:00:00</MAC>
<SSID>PRUEBA</SSID>
<RSSI>-46</RSSI>
<ChannelID>1</ChannelID>
<privacy>RSNA-CCMP</privacy>
<signalQuality>100</signalQuality>
<networkType>Infrastructure</networkType>
<rates>1/2/5,5/6/9/11/12/18/24/36/48/54</rates>
</extensions>
</wpt>
</gpx>
Quiero obtener como resultado: Using text Syntax Highlighting - SSID
- MAC
- RSSI
- ChannelID
- networkType Mi script es el siguiente: Using perl Syntax Highlighting #!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $info = XMLin("kk.xml", KeyAttr => 1);
print Dumper($info);
for my $ap ( @{$info->{extensions}} ) {
print "$ap->{SSID} => $ap->{MAC} ($ap->{RSSI})\n";
}
No me funciona :S
|
2011-12-13 17:42 @779 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10249
|
|
|
Re: Consulta de XML::Simple
|
El acceso no era correcto. 'extensions' está dentro de 'wpt'. Y el bucle recorre un hash, no un array. Using perl Syntax Highlighting #!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $info = XMLin("code_28964.xml", KeyAttr => 1);
print Dumper($info);
my $extensions_ref = $info->{wpt}->{extensions};
for my $ap ( keys %{$extensions_ref} ) {
print "$ap => $extensions_ref->{$ap}\n";
}
sale: 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
_________________ JF^D Perl programming
|
2011-12-13 18:16 @803 |
|
|
|
|
|
Re: Consulta de XML::Simple
|
En mi caso sigue mostrándome todos los datos: 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' => '
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...
|
2011-12-13 19:13 @842 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10249
|
|
|
Re: Consulta de XML::Simple
|
Hummm... interesante... tu volcado de datos es diferente del mío: 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' => ''
}
}; Eso es porque no coinciden las versiones de XML::Simple (supongo). En mi caso yo estoy con la v2.18: Using bash Syntax Highlighting explorer@casa:~/Documentos/Desarrollo> perl -MXML::Simple -E 'say $XML::Simple::VERSION'
2.18
_________________ JF^D Perl programming
|
2011-12-13 19:14 @843 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10249
|
|
|
Re: Consulta de XML::Simple
|
Para tu organización de datos, sería suficiente con modificar esta línea: Using perl Syntax Highlighting my $extensions_ref = $info->{wpt}->[0]->{extensions};
_________________ JF^D Perl programming
|
2011-12-13 19:20 @847 |
|
|
|
|
|
Re: Consulta de XML::Simple
|
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. Using perl Syntax Highlighting C:\>perl -MXML::Simple -E "say $XML::Simple::VERSION"
2.18
Es como si hace un DUMP de todo, sin realizar el " parseo".
|
2011-12-14 05:16 @261 |
|
|
|
|
|
Re: Consulta de XML::Simple
|
xml: Using xml Syntax Highlighting <?xml version="1.0" encoding="utf-8"?>
<gpx>
<wpt lat="" lon="">
<ele>0</ele>
<time>1-01-01T00:00:0.0Z</time>
<geoidheight>0</geoidheight>
<name>Mer2 [00:12:0E:03:02:01]</name>
<cmt>0</cmt>
<desc>Mer2
[00:12:0E:03:02:01]
RSSI: -81 dB
Quality: 65%
Channel 11
Speed (kph): 0
1-01-01T00:00:0.0Z</desc>
<fix></fix>
<sat>0</sat>
<hdop>0</hdop>
<vdop>0</vdop>
<pdop>0</pdop>
<extensions>
<MAC>00:12:0E:03:02:01</MAC>
<SSID>Mer2</SSID>
<RSSI>-81</RSSI>
<ChannelID>11</ChannelID>
<privacy>None</privacy>
<signalQuality>65</signalQuality>
<networkType>Infrastructure</networkType>
<rates>1/2/5,5/6/9/11/12/18/24/36/48/54</rates>
</extensions>
</wpt>
<wpt lat="" lon="">
<ele>0</ele>
<time>1-01-01T00:00:0.0Z</time>
<geoidheight>0</geoidheight>
<name>chapo1[1C:BD:00:00:00:00]</name>
<cmt>0</cmt>
<desc>chapo1
[1C:BD:00:00:00:00]
RSSI: -87 dB
Quality: 21%
Channel 11
Speed (kph): 0
1-01-01T00:00:0.0Z</desc>
<fix></fix>
<sat>0</sat>
<hdop>0</hdop>
<vdop>0</vdop>
<pdop>0</pdop>
<extensions>
<MAC>1C:BD:00:00:00:00</MAC>
<SSID>chapo1</SSID>
<RSSI>-87</RSSI>
<ChannelID>11</ChannelID>
<privacy>RSNA-CCMP</privacy>
<signalQuality>21</signalQuality>
<networkType>Infrastructure</networkType>
<rates>1/2/5,5/6/9/11/12/15/18/24/30/36/45/48/54/60/90/120/135/150</rates>
</extensions>
</wpt>
<wpt lat="" lon="">
<ele>0</ele>
<time>1-01-01T00:00:0.0Z</time>
<geoidheight>0</geoidheight>
<name>Mer1 [00:12:00:00:00:00]</name>
<cmt>0</cmt>
<desc>Mer1
[00:12:00:00:00:00]
RSSI: -61 dB
Quality: 65%
Channel 11
Speed (kph): 0
1-01-01T00:00:0.0Z</desc>
<fix></fix>
<sat>0</sat>
<hdop>0</hdop>
<vdop>0</vdop>
<pdop>0</pdop>
<extensions>
<MAC>00:12:00:00:00:00</MAC>
<SSID>Mer1</SSID>
<RSSI>-61</RSSI>
<ChannelID>11</ChannelID>
<privacy>None</privacy>
<signalQuality>65</signalQuality>
<networkType>Infrastructure</networkType>
<rates>1/2/5,5/6/9/11/12/18/24/36/48/54</rates>
</extensions>
</wpt>
</gpx>
Script: Using perl Syntax Highlighting #!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $info = XMLin("1.xml", KeyAttr => 1);
print Dumper($info);
my $extensions_ref = $info->{'wpt'}[0]->{'extensions'};
for my $ap ( keys %{$extensions_ref} ) {
print "$ap => $extensions_ref->{$ap}\n";
}
output: Using perl Syntax Highlighting $VAR1 = {
'wpt' => [
{
'vdop' => '0',
'ele' => '0',
'fix' => {},
'time' => '1-01-01T00:00:0.0Z',
'lat' => '',
'name' => 'Mer2 [00:12:0E:03:02:01]',
'hdop' => '0',
'cmt' => '0',
'geoidheight' => '0',
'extensions' => {
'networkType' => 'Infrastructure',
'rates' => '1/2/5,5/6/9/11/12/18/24/36/48/54',
'SSID' => 'Mer2',
'MAC' => '00:12:0E:03:02:01',
'signalQuality' => '65',
'RSSI' => '-81',
'ChannelID' => '11',
'privacy' => 'None'
},
'pdop' => '0',
'desc' => 'Mer2
[00:12:0E:03:02:01]
RSSI: -81 dB
Quality: 65%
Channel 11
Speed (kph): 0
1-01-01T00:00:0.0Z',
'sat' => '0',
'lon' => ''
},
{
'vdop' => '0',
'ele' => '0',
'fix' => {},
'time' => '1-01-01T00:00:0.0Z',
'lat' => '',
'name' => 'chapo1[1C:BD:00:00:00:00]',
'hdop' => '0',
'cmt' => '0',
'geoidheight' => '0',
'extensions' => {
'networkType' => 'Infrastructure',
'rates' => '1/2/5,5/6/9/11/12/15/18/24/30/36/45/48/54/60/90/120/135/150',
'SSID' => 'chapo1',
'MAC' => '1C:BD:00:00:00:00',
'signalQuality' => '21',
'RSSI' => '-87',
'ChannelID' => '11',
'privacy' => 'RSNA-CCMP'
},
'pdop' => '0',
'desc' => 'chapo1
[1C:BD:00:00:00:00]
RSSI: -87 dB
Quality: 21%
Channel 11
Speed (kph): 0
1-01-01T00:00:0.0Z',
'sat' => '0',
'lon' => ''
},
{
'vdop' => '0',
'ele' => '0',
'fix' => {},
'time' => '1-01-01T00:00:0.0Z',
'lat' => '',
'name' => 'Mer1 [00:12: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' => 'Mer1',
'MAC' => '00:12:00:00:00:00',
'signalQuality' => '65',
'RSSI' => '-61',
'ChannelID' => '11',
'privacy' => 'None'
},
'pdop' => '0',
'desc' => 'Mer1
[00:12:00:00:00:00]
RSSI: -61 dB
Quality: 65%
Channel 11
Speed (kph): 0
1-01-01T00:00:0.0Z',
'sat' => '0',
'lon' => ''
}
]
};
networkType => Infrastructure
rates => 1/2/5,5/6/9/11/12/18/24/36/48/54
SSID => Mer2
MAC => 00:12:0E:03:02:01
signalQuality => 65
RSSI => -81
ChannelID => 11
|
2011-12-14 07:51 @368 |
|
|
|
|
|
Re: Consulta de XML::Simple
|
|
Perfecto. Perdón, pero ¿cómo tendría que hacer para listar todos los "APs" y hacer los print() de cada valor por separado?
|
2011-12-14 08:23 @391 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10249
|
|
|
Re: Consulta de XML::Simple
|
Aquí hay dos soluciones, a falta de una: Using perl Syntax Highlighting #!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
# Leemos el xml
# KeyAttr => 1 : para evitar que convierta la entrada <name> en clave principal
# ForceArray => ['wpt'] : indicamos que esa marca debe ser *siempre* un array
#my $info = XMLin("code_28980.txt", KeyAttr => 1, ForceArray => ['wpt']);
my $info = XMLin("code_28964.xml", KeyAttr => 1, ForceArray => ['wpt']);
#use Data::Dumper;
#print Dumper $info;
# Una forma
# Cuántos wpt tenemos
my $n_wpt = scalar @{ $info->{wpt} } - 1;
for my $i (0 .. $n_wpt) {
my $extensions_ref = $info->{wpt}->[$i]->{extensions};
for my $ap ( keys %{$extensions_ref} ) {
print "$ap => $extensions_ref->{$ap}\n";
}
print '=' x 50, "\n";
}
print '-' x 70, "\n";
# Otra forma
# Accediendo a los valores wpt directamente
for my $wpt_ref ( @{ $info->{wpt} } ) {
my $extensions_ref = $wpt_ref->{extensions};
for my $ap ( keys %{$extensions_ref} ) {
print "$ap => $extensions_ref->{$ap}\n";
}
print '=' x 50, "\n";
}
_________________ JF^D Perl programming
|
2011-12-14 08:49 @409 |
|
|
|
|
|
Re: Consulta de XML::Simple
|
¡Muchas Gracias! ¡Funciona perfecto! Dejo el script completo: Using perl Syntax Highlighting #!/usr/bin/perl
use strict;
use warnings;
BEGIN {
eval "use XML::Simple";
if ( $@ ) {
warn "Error al cargar el modulo: XML::Simple\n"
. "instalar modulo:\n"
. "\t\tcpan\n"
. "\t\tcpan> install XML::Simple\n";
exit ();
}
}
use XML::Simple;
if ( @ARGV != 1 ) {
die "\nUso: $0 <reporte.gpx>\n";
}
my $file = $ARGV[0];
chomp $file;
# Leemos el xml
# KeyAttr => 1 : para evitar que convierta la entrada <name> en clave principal
# ForceArray => ['wpt'] : indicamos que esa marca debe ser *siempre* un array
my $info = XMLin("$file", KeyAttr => 1, ForceArray => ['wpt']);
# Una forma
# Cuántos wpt tenemos
my $n_wpt = scalar @{ $info->{wpt} } - 1;
for my $i (0 .. $n_wpt) {
my $extensions_ref = $info->{wpt}->[$i]->{extensions};
for my $ap ( keys %{$extensions_ref} ) {
print "$ap => $extensions_ref->{$ap}\n";
}
print '=' x 50, "\n";
}
Ahora voy a intentar llevar la información obtenida a un XLS.
|
2011-12-14 09:12 @425 |
|
|
|
|
|
Re: Consulta de XML::Simple
|
|
explorer, ¿es muy complicado separar los print()? Así, con esto, puedo enviar cada dato a una columna del XLS. Así como está, obtengo todos los datos juntos.
|
2011-12-14 09:23 @433 |
|
|
 |
explorer
Administrador
|
Registrado: 2005-07-24 18:12 @800 Ubicación: Valladolid, España Mensajes: 10249
|
|
|
Re: Consulta de XML::Simple
|
Pues... no... Using perl Syntax Highlighting print "networkType => $extensions_ref->{networkType}\n";
print "rates => $extensions_ref->{rates}\n";
print "SSID => $extensions_ref->{SSID}\n";
print "MAC => $extensions_ref->{MAC}\n";
print "signalQuality => $extensions_ref->{signalQuality}\n";
print "RSSI => $extensions_ref->{RSSI}\n";
print "ChannelID => $extensions_ref->{ChannelID}\n";
_________________ JF^D Perl programming
|
| Reglas del Foro |
No puedes abrir nuevos temas en este Foro No puedes responder a temas en este Foro No puedes editar tus mensajes en este Foro No puedes borrar tus mensajes en este Foro No puedes enviar adjuntos en este Foro
|
|
Socializa |
 |
|