• Publicidad

Convertir XML en TXT

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

Notapor chechoman » 2008-07-03 09:32 @439

Tengo que darles todas las gracias por la ayuda que me han prestado. Me he quedado impresionado en estos dos días por el uso de Perl; es un lenguaje demasiado potente y muy práctico, pude hacer el programita con una sola librería y sin necesidad de muchas líneas de código (37) y muy rápido.

Les adjunto el código por si alguien quiere un conversor de archivos xml a txt:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use XML::Simple;
use Data::Dumper;

opendir(DIR, "/home/principal/xml/xml1/");
        my @files= readdir(DIR);
closedir(DIR);

open (xml, ">>","/home/principal/xml/xml.txt") or (xml, ">", "/home/principal/xml/xml.txt");
        foreach my $a (@files){
                next if $a =~ /^\./;
                print "Archivos Cargados";
                print $a;
                print "\n";

                my $datos = XMLin("/home/principal/xml/xml1/$a");

                print xml join q{|},
                        $datos->{opr}            ,
                        $datos->{letra}          ,
                        $datos->{cedula}         ,
                        $datos->{PNombre}        ,
                        $datos->{SNombre}        ,
                        $datos->{PApellido}      ,
                        $datos->{FechaNac}       ,
                        $datos->{FechaCedOrg}    ,
                        $datos->{CodObjecion}    ,
                        $datos->{CodOficina}     ,
                        $datos->{CodEstadoCivil} ,
                        $datos->{Naturalizado}   ,
                        $datos->{Sexo};
                print xml "\n";

        }
print "Fin Carga";
print "\n";

close xml;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
chechoman
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2008-07-02 11:14 @510

Publicidad

Notapor explorer » 2008-07-03 10:15 @469

Según lo que indica la página de manual de open, en el uso del modo de concatenar ('>>'), si el fichero no existe, es creado.

Así que la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open (xml, ">>","/home/principal/xml/xml.txt") or (xml, ">", "/home/principal/xml/xml.txt");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
se puede dejar en
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open (xml, ">>/home/principal/xml/xml.txt") or die "$!\n";
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 chechoman » 2008-07-03 11:03 @502

¡¡Cierto maestro!! Lo corregí y si no existe el archivo la aplicación lo crea; así quedó mejor el código; gracias otra vez ;)
chechoman
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2008-07-02 11:14 @510

Notapor chechoman » 2008-07-11 15:19 @680

Tengo un problema con el código, ya que sucede que a veces ¡el archivo XML que pongo a leer tiene algunos elementos con valores vacíos! es decir, como lo pongo ahorita en el código XML en las etiquetas CodOficina o Naturlizados por ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<?xml version="1.0" encoding="UTF-8"?>
<datos xsi:noNamespaceSchemaLocation="D:\Work\prueba.xsd" opr="0">
        <letra>V</letra>
        <cedula>123</cedula>
        <PNombre>nombre</PNombre>
        <SNombre>Segundo Nombre</SNombre>
        <PApellido>apellido</PApellido>
        <FechaNac>1980-07-25</FechaNac>
        <FechaCedOrg>2005-03-31</FechaCedOrg>
        <CodObjecion>00</CodObjecion>
        <CodOficina></CodOficina>
        <CodEstadoCivil>2</CodEstadoCivil>
        <Naturalizado></Naturalizado>
        <Sexo>M</Sexo>
</datos>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El hecho es que no sé cómo hacer para que el programa en Perl me valide que si encuentra un elemento vacío le coloque la palabra NULL al archivo txt y si tiene datos, bueno, debe seguir haciendo lo que hacía.
chechoman
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2008-07-02 11:14 @510

Notapor chechoman » 2008-07-11 23:18 @013

Aparte del problema de colocar NULL en elementos que no tengan valores al leer el xml, ¡¡¡también encontré otra falla y mas grave!!!, y es cómo hacer para que el programa me procese aquellos datos con "caracteres especiales", ya que para Perl me arroja que el xml está mal formado, y es porque algunos valores tienen ñ o Ñ o acentos, entonces, ¿cómo hacer para poder leer estos datos o poder sustituirlos?
chechoman
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2008-07-02 11:14 @510

Notapor explorer » 2008-07-12 07:13 @342

Cuando XML::Simple lee esas marcas, las convierte a un hash vacío:
Código: Seleccionar todo
$VAR1 = \{
            'opr' => '0',
            'CodEstadoCivil' => '2',
            'CodOficina' => {},
            'letra' => 'V',
            'FechaCedOrg' => '2005-03-31',
            'SNombre' => 'Segundo Nombre',
            'cedula' => '123',
            'Sexo' => 'M',
            'PNombre' => 'nombre',
            'FechaNac' => '1980-07-25',
            'Naturalizado' => {},
            'CodObjecion' => '00',
            'PApellido' => 'apellido'
          };


Lo que se puede hacer es preguntar antes si tenemos un dato o es un hash vacío:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $CodOficina = 'NULL';
if ( exists $datos->{CodOficina} ) {
    if ( ref($datos->{CodOficina}) ne 'HASH' ) {
        $CodOficina = $datos->{CodOficina};
    }
}

my $Naturalizado = 'NULL';
if ( exists $datos->{Naturalizado} ) {
    if ( ref($datos->{Naturalizado}) ne 'HASH' ) {
        $Naturalizado = $datos->{Naturalizado};
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y ya solo queda pintarlo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print join q{|},
        $datos->{opr}            ,
        $datos->{letra}          ,
        $datos->{cedula}         ,
        $datos->{PNombre}        ,
        $datos->{SNombre}        ,
        $datos->{PApellido}      ,
        $datos->{FechaNac}       ,
        $datos->{FechaCedOrg}    ,
        $datos->{CodObjecion}    ,
        $CodOficina     ,
        $datos->{CodEstadoCivil} ,
        $Naturalizado   ,
        $datos->{Sexo};
print "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sale:
Código: Seleccionar todo
0|V|123|nombre|Segundo Nombre|apellido|1980-07-25|2005-03-31|00|NULL|2|NULL|M
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 chechoman » 2008-07-12 12:13 @550

Sí funciono, gracias. Solo me está faltando que el programa en Perl pueda leer valores como 'ñ', 'Ñ' y palabras acentuadas, que algunos nombres incluyen estos datos y vienen en el XML, y Perl al leerlo no los reconoce y cuando empieza a procesar me arroja el error:
Código: Seleccionar todo
not well-formed (invalid token) at line 1, column 214, byte 214 at /usr/local/lib/perl/5.8.8/XML/Parser.pm line 187


Me puse a averiguar y averiguar dándome cabezazos y resulta que es efectivamente porque se necesita una forma para parsear estos caracteres :s.

Instalé entonces en el sistema la librería "expat" y después a través del CPAN instalé la librería XML::Parser, pero no me sirvió de mucho, pensé que quizás debería leer todo el xml y por cada símbolo que consiga lo cambie por un valor "x" y después cuando lo vaya a guardar el valor "x" lo transforme en el que corresponde, pero me pareció algo super enrollado ademas de que me puede saturar el servicio con tantos cálculos que realiza, ya que este programa en Perl está realizando varias cosas como por ejemplo leer muchos .zip y verificar la integridad a través de sha1 y compararla, después descomprimirlos y hacer un respaldo del zip, posteriormente leer los xml y procesarlos y es ahí donde me arroja el error con los caracteres, de verdad no sé qué hacer por ahí :s
chechoman
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2008-07-02 11:14 @510

Notapor explorer » 2008-07-12 12:49 @576

Tienes que ver cómo está codificado el carácter que está en la posición de fallo que te indica (línea 1, columna 214). Debe coincidir la codificación con la indicada en la cabecera del xml.
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 chechoman » 2008-07-12 13:32 @605

No, pues la codificación del xml es utf-8, y como estos son caracteres que no están dentro de esta configuración es que arroja el error.
chechoman
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2008-07-02 11:14 @510

Notapor explorer » 2008-07-12 14:07 @630

Precisamente. No es un error lo que te sale en el mensaje. Si la codificación interna de los caracteres no coincide con lo que pone en la cabecera, entonces el xml no está bien formado (not well-formed), y por eso es rechazado.

Deberás decidir qué hacer:
* cambiar la cabecera para que refleje la codificación de esos caracteres
* cambiar la codificación de esos caracteres, en origen (no tú)
* cambiar la codificación de esos caracteres tú mismo.

La más cómoda es la primera: solo tienes que cambiar una línea.
La más idónea es la segunda: no es problema tuyo recibir xml que están mal formados
La más horrible es la tercera: convertirá el proyecto informático en una inmensa chapuza.


P.D. Hablando de acentos, se te escapan algunos, cuando escribes aquí :-)
Última edición por explorer el 2008-07-13 06:49 @325, editado 1 vez en total
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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