• Publicidad

Consulta sobre XML

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Consulta sobre XML

Notapor situ » 2008-06-04 14:18 @637

Tengo el siguiente XML, el cual me gustaria parsear con perl y que me de los resultados en pantalla.
Estoy tratando de usar XML::Simple pero la verdad que no obtengo un resultado :?

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<?xml version="1.0"?>
<owner>
<technology name="test">
<owner>
<pc>
<name>marcos</name>
<url>https://10.1.1.1</url>
<ip>10.1.1.1</ip>
<user name="admin"><password>123</password><date>20080101</date></user>
<user name="root"><password>123</password><date>20080101</date></user>
<notes>test</notes>
</pc>
<pc>
<name>marcos2</name>
<url>https://10.2.2.2</url>
<ip>10.2.2.2</ip>
<user name="root"><password>asd</password><date>20080102</date></user>
<notes>testno/notes>
</pc>
</technology>
</owner>
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Gracias
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Notapor situ » 2008-06-04 15:26 @685

Tengo este script pero no me entrega información :S

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
 #!/usr/bin/perl
use XML::Simple;
my $info = XMLin("/home/situ/test.xml");
for( @{$info->{host}} ) {
    print "$_->{name} => $_->{url} ($_->{ip})\n";
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-06-04 16:29 @728

* Dentro de <technology> hay un <owner> que no está cerrado
* El segundo <notes> no está bien cerrado

El correcto, creo que es este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<?xml version="1.0"?>
<owner>
        <technology name="test">
                <pc>
                        <name>marcos</name>
                        <url>https://10.1.1.1</url>
                        <ip>10.1.1.1</ip>
                        <user name="admin"><password>123</password><date>20080101</date></user>
                        <user name="root"><password>123</password><date>20080101</date></user>
                        <notes>test</notes>
                </pc>
                <pc>
                        <name>marcos2</name>
                        <url>https://10.2.2.2</url>
                        <ip>10.2.2.2</ip>
                        <user name="root"><password>asd</password><date>20080102</date></user>
                        <notes>testno</notes>
                </pc>
        </technology>
</owner>
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

Notapor explorer » 2008-06-04 16:57 @748

Recuerda: La palabra Simple de XML::Simple se refiere a que es simple de uso no de uso simple. Humm... quiero decir que no es tan simple de usar, porque el módulo es simple... hummm... algo así.

Recuerda dos: Data::Dumper es tu amigo.

Dado el XML que te he pasado antes, con este programa:
Sintáxis: [ Descargar ] [ Ocultar ]
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 $pc ( @{$info->{technology}{pc}} ) {
    print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale
Código: Seleccionar todo
$VAR1 = {
            'technology' => {
                              'name' => 'test',
                              'pc' => [
                                        {
                                          'notes' => 'test',
                                          'ip' => '10.1.1.1',
                                          'user' => [
                                                      {
                                                        'password' => '123',
                                                        'date' => '20080101',
                                                        'name' => 'admin'
                                                      },
                                                      {
                                                        'password' => '123',
                                                        'date' => '20080101',
                                                        'name' => 'root'
                                                      }
                                                    ],
                                          'url' => 'https://10.1.1.1',
                                          'name' => 'marcos'
                                        },
                                        {
                                          'notes' => 'testno',
                                          'ip' => '10.2.2.2',
                                          'user' => {
                                                      'password' => 'asd',
                                                      'date' => '20080102',
                                                      'name' => 'root'
                                                    },
                                          'url' => 'https://10.2.2.2',
                                          'name' => 'marcos2'
                                        }
                                      ]
                            }
          };
marcos => https://10.1.1.1 (10.1.1.1)
marcos2 => https://10.2.2.2 (10.2.2.2)
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

Notapor situ » 2008-06-04 18:14 @801

Estoy tratando de poner más información, por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
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 $pc ( @{$info->{technology}{pc}} ) {
    print "$pc->{name} => $pc->{url} ($pc->{ip}) $pc->{notes} $pc->{user}->{date}\n";
    }
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Obtengo "date" solamente en el segundo resultado y no en todos :S

Pseudo-hashes are deprecated at xml.pl line 12.
Use of uninitialized value in concatenation (.) or string at xml.pl line 12.
marcos => https://10.1.1.1 (10.1.1.1) test
marcos2 => https://10.2.2.2 (10.2.2.2) testno 20080102
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-06-04 18:46 @824

Fíjate bien en el volcado (dump).

Resulta que dentro de {technology}{pc}[0]{user}, hay un array anónimo (fíjate en la presencia de unos corchetes) que contiene dos elementos, mientras que {technology}{pc}[1]{user} es un hash con los atributos de un solo usuario.

Ya hemos dicho que XML::Simple es simple de entenderas, por lo que hay que ayudarle un poco a que nos lea bien el XML.

Forzaremos a que se comporte con 'user' siempre de la misma manera. Para eso, cambiamos la línea del XMLin() a
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $info = XMLin("kk.xml", KeyAttr => 1, ForceArray => [ 'user' ]);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Y ya tenemos
Código: Seleccionar todo
$VAR1 = {
          'technology' => {
                            'name' => 'test',
                            'pc' => [
                                      {
                                        'notes' => 'test',
                                        'ip' => '10.1.1.1',
                                        'user' => [
                                                    {
                                                      'password' => '123',
                                                      'date' => '20080101',
                                                      'name' => 'admin'
                                                    },
                                                    {
                                                      'password' => '123',
                                                      'date' => '20080101',
                                                      'name' => 'root'
                                                    }
                                                  ],
                                        'url' => 'https://10.1.1.1',
                                        'name' => 'marcos'
                                      },
                                      {
                                        'notes' => 'testno',
                                        'ip' => '10.2.2.2',
                                        'user' => [
                                                    {
                                                      'password' => 'asd',
                                                      'date' => '20080102',
                                                      'name' => 'root'
                                                    }
                                                  ],
                                        'url' => 'https://10.2.2.2',
                                        'name' => 'marcos2'
                                      }
                                    ]
                          }
        };

con lo que con el programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $pc ( @{$info->{technology}{pc}} ) {
    print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
    for my $user ( @{$pc->{user}} ) {
        print "\t$user->{name} : $user->{date}\n";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
sale
Código: Seleccionar todo
marcos => https://10.1.1.1 (10.1.1.1)
        admin : 20080101
        root : 20080101
marcos2 => https://10.2.2.2 (10.2.2.2)
        root : 20080102
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

Notapor situ » 2008-06-04 18:50 @826

La verdad que muchas gracias, siempre me ayudas en lo que necesito.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor situ » 2008-06-05 20:21 @889

Explorer,
Te hago una consulta: ¿hay forma de dividir, por ejemplo

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $pc ( @{$info->{technology}{pc}} ) {
    print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
    for my $user ( @{$pc->{user}} ) {
        print "\t$user->{name} : $user->{date}\n";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
?

Porque me gustaría hacer en el script un tipo de buscador, donde yo, poniendo por ejemplo
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl miscript.pl -name marcos
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

me muestre la información de esa PC.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-06-05 21:00 @916

Con el siguiente programa
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -s
use XML::Simple;
use strict;
use warnings;

our $name;
my $info = XMLin("kk.xml", KeyAttr => 1, ForceArray => [ 'user' ]);
my $host = $name || '.+';

for my $pc ( @{$info->{technology}{pc}} ) {

    next if $pc->{name} !~ /^$host$/;

    print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
    for my $user ( @{$pc->{user}} ) {
        print "\t$user->{name} : $user->{date}\n";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
invocándolo con
Código: Seleccionar todo
./kk.pl -name=marcos
sale
Código: Seleccionar todo
marcos => https://10.1.1.1 (10.1.1.1)
        admin : 20080101
        root : 20080101

Notas:
* Hemos puesto un flag '-s' al principio, para que haga el procesamiento de los argumentos. Es algo simplón, pero efectivo para cosas pequeñas
* Agregamos la línea del 'our' para indicar la presencia de una variable global (la que Perl usará para guardar el valor del parámetro pasado por el usuario)
* Creamos y definimos la variable $host, que guardará el nombre de la máquina, o (||) una expresión regular que coincidirá con cualquier nombre de máquina. Esto lo hacemos para el caso de que el usuario no ponga ningún parámetro y salgan entonces todas las máquinas
* Agregamos la línea del next, para filtrar los $pc que coinciden con nuestro nombre de $host. Observar el hecho de que, realmente, estamos admitiendo como nombre de máquina una expresión regular. Podríamos haber ejecutado el programa con ./kk.pl -name=marcos.* y saldrán todas las máquinas cuyo nombre empiece por 'marcos'.
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

Notapor situ » 2008-06-06 09:16 @428

Muchísimas gracias, espero no tener que molestar con alguna consulta.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Siguiente

Volver a Intermedio

¿Quién está conectado?

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