• 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.

Notapor situ » 2008-06-09 12:00 @542

Te hago una consulta. ¿Este módulo tiene para escribir en el XML?, porque mi idea es más adelante poder ingresar más datos al XML desde la consola.

EDIT:
Ahí lo encontré:
http://search.cpan.org/dist/XML-Writer/Writer.pm

Voy a ver si puedo adaptarlo :D
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Publicidad

Notapor explorer » 2008-06-09 13:44 @613

Puedes escribirlo con la función XMLout() del mismo módulo XML::Simple.
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-09 14:54 @662

Explorer,
Tenes algun ejemplo que no sea este:
viewtopic.php?t=1261&highlight=xml+simple
Ya que no lo logro hacer funcionar
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-06-09 15:47 @699

Hay un montón de ejemplos en estos foros. Busca por las palabras XML y Simple. Activa la opción "Buscar todas las palabras". También puedes restringir la búsqueda a los mensajes escritor por mí (pon 'explorer' en la caja de autores). Puedes reducir aún más la búsqueda, agregando la palabra XMLout. Salen 6 hilos, incluido este.
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-09 16:51 @744

Consulta, me quedó el siguiente script.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -s
use strict;
use warnings;

##
BEGIN {
    eval "use XML::Simple";
    if ( $@ ) {
        warn  "Error al cargar el modulo: XML::Simple\n"
            . "Instalar Modulo:\n"
            . "\t\tcpan XML::Simple\n\n";
        exit();
    }
}

our $name;
our $notes;
our $ip;
our $url;

## Ayuda del sistema
if ( !$name and !$notes and !$ip and !$url ) {
    die "Uso: $0 [-name|-notes|-ip|-url]\n"
      . "\t-name=pc                 Busqueda por nombre del host\n"
      . "\t-notes=test              Busqueda por nota\n"
      . "\t-ip=1.1.1.1              Busqueda por direccion IP\n"
      . "\t-url=https://10.0.0.1    Busqueda por url\n\n"
      ;
}

my $info = XMLin('kk.xml', KeyAttr => 1, ForceArray => [ 'user' ]);

for my $pc ( @{$info->{technology}{pc}} ) {
    next if $name  and $pc->{name}  !~ /^$name$/;
    next if $notes and $pc->{notes} !~ /^$notes$/;
    next if $ip    and $pc->{ip}    !~ /^$ip$/;
    next if $url   and $pc->{url}   !~ /^$url$/;

    print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
    for my $user ( @{$pc->{user}} ) {
        print "\t$user->{name} : $user->{password}\n";
    }
}

sub crear{
my $xml = << "END_OF_XML";
<pc>
    <name>marcos3</name>
    <url>https://10.1.1.1</url>
        <ip>10.3.3.3.</ip>
    <user name="admin"><password>4444</password><date>20080333</date></user>
    <notes>culito</notes>
</pc>
END_OF_XML
open  $fh, q{>>:encoding(iso-8859-1)}, 'kk.xml';
print $fh $xml;
close $fh;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Ahora me gustaría hacer que cuando alguien pone:
Código: Seleccionar todo
./prueba.pl -crear

Se ejecute la función "crear".

Otro punto que no logro resolver es que al enviarle a mi XML la nueva información se pone errónea, ya que no tengo los parámetros.
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
</technology>
</owner>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Que fueron cerrados anteriormente.

Si alguno me puede ayudar, se lo voy agradecer mucho :D
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-06-09 17:03 @752

No se parece mucho ese XML al que has enseñado en mensajes anteriores...
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-09 17:16 @761

Es el XMl que me arreglaste vos.
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


Ese uso, ahora quería hacer para agregar yo desde el script.

El script es que también me arreglaste, solamente le agregue la función de crear, que la saque de otro post.
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor explorer » 2008-06-09 19:22 @848

Repito: el módulo XML::Simple es para hacer cosas sencillas. Si queremos hacer cosas más elaboradas es mejor usar otros módulos.

En el caso que nos ocupa, yo siempre he tenido que pedir ayuda al módulo Data::Dumper, para ver la forma que tiene la estructura que XMLin() me devuelve. Y luego, usar esa misma estructura. Pero no siempre se consigue una salida perfecta con XMLout().

Por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -s
use strict;
use warnings;

##
BEGIN {
    eval "use XML::Simple";
    if ( $@ ) {
        warn  "Error al cargar el modulo: XML::Simple\n"
            . "Instalar Modulo:\n"
            . "\t\tcpan XML::Simple\n\n";
        exit();
    }
}

our $crear;
our $name;
our $notes;
our $ip;
our $url;

## Ayuda del sistema
if ( !$name and !$notes and !$ip and !$url and !$crear ) {
    die "Uso: $0 [-name|-notes|-ip|-url]\n"
      . "\t-name=pc                 Busqueda por nombre del host\n"
      . "\t-notes=test              Busqueda por nota\n"
      . "\t-ip=1.1.1.1              Busqueda por direccion IP\n"
      . "\t-url=https://10.0.0.1    Busqueda por url\n\n"
      . "\t-crear                   Añade nuevos contenidos"
      ;
}

my $info = XMLin('kk.xml', KeyAttr => 1, ForceArray => [ 'user' ]);

if ( !$crear ) {
    for my $pc ( @{$info->{technology}{pc}} ) {
        next if $name  and $pc->{name}  !~ /^$name$/;
        next if $notes and $pc->{notes} !~ /^$notes$/;
        next if $ip    and $pc->{ip}    !~ /^$ip$/;
        next if $url   and $pc->{url}   !~ /^$url$/;

        print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
        for my $user ( @{$pc->{user}} ) {
            print "\t$user->{name} : $user->{password}\n";
        }
    }
}
else {
    push @{$info->{technology}{pc}}, {
        name    => 'marcos3',
        url     => 'https://10.1.1.1',
        ip      => '10.3.3.3',
        user    => [{
                        name    => 'admin',
                        password=> 4444,
                        date    => 20080333,
                    }],
        notes   => 'culito',
    };
    #use Data::Dumper;
    #print Dumper $info;

    print XMLout($info, RootName => 'owner', XMLDecl => 1 );
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
el resultado es
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<?xml version='1.0' standalone='yes'?>
<owner>
  <technology name="test">
    <pc name="marcos" ip="10.1.1.1" notes="test" url="https://10.1.1.1">
      <user name="admin" date="20080101" password="123" />
      <user name="root" date="20080101" password="123" />
    </pc>
    <pc name="marcos2" ip="10.2.2.2" notes="testno" url="https://10.2.2.2">
      <user name="root" date="20080102" password="asd" />
    </pc>
    <pc name="marcos3" ip="10.3.3.3" notes="culito" url="https://10.1.1.1">
      <user name="admin" date="20080333" password="4444" />
    </pc>
  </technology>
</owner>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
mientras que si cambiamos la línea del XMLout() a
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print XMLout($info, RootName => 'owner', XMLDecl => 1, NoAttr => 1 );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
entonces la salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<?xml version='1.0' standalone='yes'?>
<owner>
  <technology>
    <name>test</name>
    <pc>
      <name>marcos</name>
      <ip>10.1.1.1</ip>
      <notes>test</notes>
      <url>https://10.1.1.1</url>
      <user>
        <name>admin</name>
        <date>20080101</date>
        <password>123</password>
      </user>
      <user>
        <name>root</name>
        <date>20080101</date>
        <password>123</password>
      </user>
    </pc>
    <pc>
      <name>marcos2</name>
      <ip>10.2.2.2</ip>
      <notes>testno</notes>
      <url>https://10.2.2.2</url>
      <user>
        <name>root</name>
        <date>20080102</date>
        <password>asd</password>
      </user>
    </pc>
    <pc>
      <name>marcos3</name>
      <ip>10.3.3.3</ip>
      <notes>culito</notes>
      <url>https://10.1.1.1</url>
      <user>
        <name>admin</name>
        <date>20080333</date>
        <password>4444</password>
      </user>
    </pc>
  </technology>
</owner>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Los dos xml son perfectamente válidos, pero no están formateados según como nosotros queremos. Según la documentación de XML::Simple, con un poco de esfuerzo se puede conseguir definir cómo queremos exactamente esa salida, para que coincida con la que le dimos en la entrada. Pero la experiencia dice que, en algunas ocasiones, esa salida es casi imposible de encontrar con las opciones que se le pueden pasar a XMLout(). En esos casos, lo mejor es usar otro módulo XML distinto.

En los desarrollos en los que yo he utilizado XML::Simple, siempre me he preocupado de que tanto la salida como la entrada sean muy sencillos de generar. Para esto he seguido la siguiente estrategia: He creado primero la estructura de datos. Y luego la he mandado grabar con XMLout(). El resultado es un fichero xml. Luego, averiguar la combinación que debo usar en XMLin() para obtener la misma estructura de datos.

¿Qué otras alternativas hay? Hay centenares de módulos para XML. Yo probaría XML::Smart (llevo años buscando una buena escusa para usarlo), ya que es mucho más fácil de manejar que XML::Simple.
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-10 00:51 @077

Muchisimas gracias, como siempre aprendo mucho de este foro :D
situ
Perlero nuevo
Perlero nuevo
 
Mensajes: 358
Registrado: 2007-04-09 01:44 @114

Notapor situ » 2008-06-10 17:44 @781

Explorer,
Una consulta ahi pude ir advanzando con el script, ahora puedo encriptar y desencriptar la password :D.
Como puedo hacer para que la persona pueda ingresar mas de un usuario cuando esta creando un nuevo Host.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -s
use strict;
use warnings;
use POSIX qw(strftime);
my $hday= strftime("%Y%m%d", localtime);

##Verificacion del modulo XML::Simple
BEGIN {
    eval "use XML::Simple";
    if ( $@ ) {
        warn  "Error al cargar el modulo: XML::Simple\n"
            . "Instalar Modulo:\n"
            . "\t\tcpan XML::Simple\n\n";
        exit();
    }
}

our $crear;
our $name;
our $notes;
our $ip;
our $url;
our $descrypt;

## Ayuda del sistema
if ( !$name and !$notes and !$ip and !$url and !$crear and !$descrypt) {
    die "Uso: $0 [-name|-notes|-ip|-url|-crear|-descrypt]\n"
      . "\t-name=pc                 Busqueda por nombre del host\n"
      . "\t-notes=test              Busqueda por nota\n"
      . "\t-ip=1.1.1.1              Busqueda por direccion IP\n"
      . "\t-url=https://10.0.0.1    Busqueda por url\n"
      . "\t-crear                   Adjuntar nuevos contenidos\n"
          . "\t-descrypt                Desencriptar password\n"
      ;
}

my $info = XMLin('kk.xml', KeyAttr => 1, ForceArray => [ 'user' ]);

if ( $name and $descrypt ) {
            print "- Ingresar password de la key gpg\n";
            system("gpg --no-options $name.pw.asc");
            open my $FILE, '<', "$name.pw" or die $!;
        my @lines = <$FILE>;
            for my $pc ( @{$info->{technology}{pc}} ) {
        next if $name  and $pc->{name}  !~ /^$name$/;
        print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
    for my $user ( @{$pc->{user}} ) {
        print "\t   $user->{name} : @lines\n";
        system("rm -f $name.pw");
                close $FILE;
                exit ();
        }
    }


}

if ( !$crear ) {
    for my $pc ( @{$info->{technology}{pc}} ) {
        next if $name  and $pc->{name}  !~ /^$name$/;
        next if $notes and $pc->{notes} !~ /^$notes$/;
        next if $ip    and $pc->{ip}    !~ /^$ip$/;
        next if $url   and $pc->{url}   !~ /^$url$/;
        print "$pc->{name} => $pc->{url} ($pc->{ip})\n";
        for my $user ( @{$pc->{user}} ) {
            print "\t   $user->{name} : $user->{password}\n";
        }
    }
}

else {
    print "- Ingresar nombre del Host: ";
    my $hname=<STDIN>;
    chop($hname);
    print "- Ingresar url: ";
    my $hurl=<STDIN>;
    chop($hurl);
    print "- Ingresar IP: ";
    my $hip=<STDIN>;
    chop($hip);
        print "- Ingresar notas: ";
    my $hnota=<STDIN>;
    chop($hnota);
    print "- Ingresar usuario: ";
    my $huser=<STDIN>;
    chop($huser);
## Creacion del archivo del password y la encriptacion
    open  (my $NHOST , "> $hname.pw");
    print "- Ingresar password (el password no aparece): ";
    system "stty -echo";
    my $hpass=<STDIN>;
    chop($hpass);
    print $NHOST "$hpass";
    close ($NHOST);
    system "stty echo";
        print "\n- Ingresar password de la key gpg\n";
        system("gpg -ac --no-options $hname.pw");
        system("rm -f $hname.pw");
##Termina  el archivo del password y la encriptacion   

   push @{$info->{technology}{pc}}, {
        name    => $hname,
        url     => $hurl,
        ip      => $hip,
        user    => [{
                        name    => $huser,
                        password=> "$hname.pw.asc",
                        date    => $hday,
                    }],
        notes   => $hnota,
    };
#use Data::Dumper;
#print Dumper $info;
#Escribo sobre el archivo xml la salida
open  my $SV, q{>:encoding(iso-8859-1)}, 'kk.xml';
print $SV XMLout($info, RootName => 'owner', XMLDecl => 1, NoAttr => 1 );
close ($SV)
}
 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


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

AnteriorSiguiente

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron