• Publicidad

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.

XML::Simple

Notapor otorices » 2009-04-16 14:30 @646

¡Hola!

Estoy haciendo un programa que toma por entrada varios informes médicos, cada uno almacenado en un fichero distinto, y según va identificando palabras clave (diagnóstico, evolución, analítica...) en los informes, genera etiquetas XML y guardar cada informe en otro fichero distinto de extensión xml. Para hacer esto utilizo el módulo XML::Simple.

El caso es que todos los informes no tienen la misma estructura, en algunos por ejemplo aparecerá el apartado "diagnóstico" pero en otros no...). Para cada informe voy guardando la información en una variable llamada $xml, y en cuando termina de leer el informe completo lo exporto a un documento XML usando la función XMLout($xml,...).
Después de hacer cada XMLout, quiero eliminar la estructura generada en $xml, y esto es lo que no termino de conseguir.

Esto es parte de lo que puede tener $xml al leer un informe:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$xml = {
          'Id' => [],
          'Evolucion' => [],
          'Diagostico' => {
                            'Diferencial' => [],
                            'Clinico' => [],
                            'Impresion' => [],
                            'Histeroscopia' => []
};
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Lo que quiero conseguir es algo así como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$xml = {};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Vamos, hacerlo nulo, resetearlo...
Lo he intentando haciendo lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
@{ $xml->{"Evolucion"} } = ();
@{ $xml->{"Diagostico"}->{"Impresion"} } = ();                 
@{ $xml->{"Diagostico"}->{"Histeroscopia"} } = ();
@{ $xml->{"Diagostico"}->{"Clinico"} } = ();
@{ $xml->{"Diagostico"}->{"Diferencial"} } = ();
#Viendo que con lo anterior sólo me quedaba "Diagnostico" sin eliminar, ya que tiene subetiquetas, intenté poner:
@{ $xml->{"Diagostico"} } = ();
#Pero me daba error.
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero solo me funciona bien en el apartado "Evolucion", ya que no tiene subetiquetas.

El problema por lo tanto es que genero documentos XML con varias etiquetas sin contenido (justo las etiquetas que a su vez contienen más etiquetas, como es el caso de "Diagnostico"), y eso es lo que quiero evitar.


Muchísimas gracias por vuestra paciencia,

¡Saludos!
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Publicidad

Notapor explorer » 2009-04-16 14:39 @652

Bienvenido a los foros de Perl en Español, otorices.

Con esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
undef $xml;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


O quizás el extraño (no probado por mí)
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
reset 'x'; # reiniciará todas las variables que empiezan por 'x'
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor teco000 » 2009-04-16 15:08 @672

Saludos, no sé si me pueden ayudar, estoy haciendo también un programa que interprete el siguiente XML:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<?xml version="1.0" encoding="UTF-8"?>
<RBANCREDIT>
   <ESTADO>0</ESTADO>
   <ERROR></ERROR>
   <TELEFONO>0055137160</TELEFONO>
   <FACTURA>0000611235</FACTURA>
   <FECHAFAC>20090216</FECHAFAC>
   <NOMBRE>MARIA EUGENIA MENDOZA MARIN</NOMBRE>
   <MONTO>1667.00</MONTO>
</RBANCREDIT>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


pero no lo logro leer campo a campo, el print() del Dumper() sí me funciona. ¿Me pueden ayudar?
El código es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        my $decoded = decode_base64($resultado);
        print"\Decoded  Recibido $decoded\n\n";
        my $info = XMLin($decoded);
        print Dumper($info);
        foreach my $archivo ( @{ $info->{RBANCREDIT} } ) {
            print
                join q{;},
                $archivo->{FACTURA}    ,
                $archivo->{ERROR}          ,
                $archivo->{MONTO}   ,
                $archivo->{ESTADO}   ,
                $archivo->{TELEFONO}    ,
                ;
    print "\n";
    }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por cierto, no sé si es correcto preguntar en este hilo que era sobre otra duda; de no ser así, perdón.
teco000
Perlero nuevo
Perlero nuevo
 
Mensajes: 67
Registrado: 2008-05-29 15:22 @682
Ubicación: Guatemala

Correcto, explorer

Notapor otorices » 2009-04-16 15:13 @676

Resulta que era así de sencillo...
Me ha funcionado bien con el undef(), pero no con la orden reset().

¡¡¡Muchas gracias por tu rapidísima y buena respuesta!!!
Última edición por otorices el 2009-04-16 15:21 @681, editado 1 vez en total
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Notapor explorer » 2009-04-16 15:15 @677

Yo empezaría otro hilo, teco000. No tiene nada que ver con la pregunta iniciada por otorices.
Última edición por explorer el 2009-04-17 09:58 @457, editado 1 vez en total
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Otra pequeña duda

Notapor otorices » 2009-04-16 15:42 @696

Me acabo de acordar de otra duda que tengo:

La etiqueta que delimita cada informe es <Informe> (especificado en el atributo RootName => 'Informe', dentro de XMLout()), pero como cada informe tiene un número que lo identifica, ¿cómo puedo hacer para añadir un atributo "id" a esa etiqueta? Quedaría de esta forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<Informe id="XXXX">
    <etiqueta1> XXX </etiqueta1>

     ...
   
    <etiqueta_n> XXX </etiqueta_n>
</Informe>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¡Muchas gracias de nuevo!
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Notapor explorer » 2009-04-16 18:55 @830

Lo malo de XML::Simple es que es demasiado simple...

Habría que ver qué atributos de XMLout() hay que probar y tocar para que den el resultado... por experiencia te puedo decir que puede pasar mucho tiempo hasta que lo descubres.

Otra forma, más pedestre, podría ser esta: generas el XML pero sin el RootName y lo guardas en una variable. Supongamos que esa variable es $xml_nuevo. Entonces, podrías hacer

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$xml_nuevo = qq(<Informe id="$numero">\n    $xml_nuevo\n</Informe>\n);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Vamos, que generas el xml en dos pasos.

Hay más módulos para tratar con XML (¡doscientos!). Por ejemplo, XML::Smart.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Gracias de nuevo

Notapor otorices » 2009-04-17 09:39 @444

Gracias de nuevo por tu respuesta explorer.

Creo que le echaré un vistazo a XML::Smart:
Con XML::Simple, si evito poner el RootName, se crea una etiqueta "opt" por defecto, por lo tanto no me serviría tu solución. He estado mirando todos los atributos de XMLOut pero no encuentro ninguno con el que poder añadir un atributo "Id" a la etiqueta global.

Gracias de nuevo.
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Notapor explorer » 2009-04-17 09:50 @451

Para que no genere una etiqueta raíz, te vale con definir RootName con un valor undef o una cadena vacía, según pone en la documentación de XML::Simple.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor otorices » 2009-04-17 10:28 @478

OK. Si que había mirado en la documentación de XML::Simple, pero la verdad es que no me había dado cuenta de ello...

Gracias otra vez.
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron