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

Re: XML::Simple

Notapor Jenda » 2009-04-18 16:32 @730

otorices escribiste:
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.002 segundos, usando GeSHi 1.0.8.4



El problema es que $xml->{"Diagnostico"} contiene una referencia al hash, pero tú lo tratas de usar como si contuviera una referencia al array. Si quieres que esa llave contenga una referencia al array vacío haz

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$xml->{"Diagostico"} = [];
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


si quieres que no contenga nada haz

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$xml->{"Diagostico"} = undef;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y si quieres que la llave no exista en ese hash haz

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
delete $xml->{"Diagostico"};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y no tienes que eliminar las cosas dentro del hash referido por $xml->{"Diagostico"}. Si ajustas $xml al undef(), todos los contenidos desaparecen y toda la memoria queda desocupada.

explorer escribiste: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


Es mejor ni recordar "reset()". No funciona con variables léxicas de todos modos.
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Publicidad

Gracias

Notapor otorices » 2009-04-19 06:12 @300

OK. Gracias por tu información.
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Orden de las etiquetas

Notapor otorices » 2009-05-20 05:36 @275

Buenas,

Vuelvo a la carga otra vez con el tema de XML::Simple.
En este caso, se trata el orden en el que se guardan las etiquetas XML al hacer el XMLOut.

El caso es que según voy encontrando etiquetas en los informes, voy haciendo un push():

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
push @{ $xml->{"Etiqueta"} },{ 'content' => $datos };
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y se supone que al exportar el documento XML las etiquetas deberían salir en el orden que he ido siguiendo al hacer los push(), pero no es así.

Mirando la documentación de XML::Simple lo único que he encontrado en referencia al orden de las etiquetas es el atributo NoSort, con el cual podemos anular el orden alfabético de las etiquetas que la función aplica por defecto. Pero a pesar de ello, las etiquetas me salen en un orden que en principio parece aleatorio...

Os pongo un informe de ejemplo:

Código: Seleccionar todo
2000006  INFORME.                                                                                                                                                               
                                                                                                                                                                                           
MOTIVO DE INGRESO:   

texto
                                                                                                                                                                                           
DATOS RELEVANTES DE HISTORIA CLINICA Y EXPLORACION:                                                                                                                       
texto
                                                                                                                                                                                           
INTERVENCION PRACTICADA:                                                                                                                                               
texto
                                                                                                                                                                                           
DIAGNOSTICO:                   
texto
                                                                                                                                                                                           
TRATAMIENTO A SEGUIR:
texto


Y este es el XML que me genera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<Informe id="2000006">
  <Diagnostico>
    <Clinico>- texto.</Clinico>
  </Diagnostico>
  <Motivo>
    <Ingreso>texto</Ingreso>
  </Motivo>
  <Intervencion>texto</Intervencion>
  <Tratamiento_y_recomendaciones>
    <Al_alta>texto</Al_alta>
  </Tratamiento_y_recomendaciones>
  <Resumen_historia>texto</Resumen_historia>
</Informe>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Como se puede apreciar, se etiqueta antes el apartado diagnostico que el de motivo de ingreso por ejemplo, cuando no debería ser así.

El caso es que necesito mantener el orden para no tener problemas con la validación del XML usando un DTD.

¡¡Muchas gracias por vuestra atención!!
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Notapor explorer » 2009-05-20 07:51 @368

La salida desordenada es porque en Perl, los diccionarios (hash) guardan los valores según un orden interno, que no tiene que ver con el orden de inserción.

Si quieres mantener el mismo orden de entrada que de salida, debes usar un módulo como el Tie::IxHash, como se comenta también en este hilo.

Actualización: no lo he probado y estoy dudando de si alguna vez lo he hecho. Lo probaré dentro de un rato.
Última edición por explorer el 2009-05-20 08:07 @380, 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

Notapor explorer » 2009-05-20 07:55 @371

Una cosilla importante... en pocos casos es necesario mantener el orden dentro de un XML. En tu ejemplo, un programa va a leer todo el registro Informe con toda la información que contiene, de golpe. Al usuario le vas a mostrar la información ya ordenada.
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 » 2009-05-21 09:47 @449

En el FAQ de XML::Simple se comenta que si realmente es imprescindible mantener el orden de los elementos, no uses XML::Simple.

En otros foros se recomienda el uso de XML::LibXML, pero bueno... hay doscientos más...
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 otorices » 2009-05-24 08:56 @414

¿Quieres decir con eso que aun usando el módulo Tie::IxHash es imposible mantener el orden de los elementos?
otorices
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2009-04-16 13:59 @624

Notapor explorer » 2009-05-24 19:32 @855

El autor de XML::Simple dice (en el FAQ de la distribución) que no está hecho. Solo está pensado.

Ahora mismo no sé decirte qué otro módulo XML puede hacer eso, pero el autor recomiendo XML::LibXML.

También dice que, en realidad, no deberíamos preocuparnos del orden: hay que pensar que estamos delante de registros de una base de datos jerárquica.

Solo en una ocasión he tenido que llevar un orden en un XML, y fue cuando necesitaba generar un registro por cada día del año en curso.

La solución fue muy sencilla: me daba igual el orden, y los registros iban acompañados de un atributo llamado daynumber que guardaba el orden.

Así, solo tenía que hacer lo siguiente: leer el fichero entero con XMLin(), y a partir de ese momento, ya puedo recorrer todos los días o buscar por un día en concreto. No necesité sacar los días por orden, pero en ese caso hubiera creado un arreglo con los datos de cada día, indexados por el número del día, así saldrán ya ordenados.

En tu caso: a mi me da igual el orden en que quedan guardados los valores dentro del <informe>. Lo que me interesa es que al leerlo, lo hago completamente (todo el registro), así que lo sacaré en el orden que yo quiera al usuario o informe escrito.

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

use XML::Simple;
use feature 'say';

my $xml_ref = XMLin('kk.xml');

use Data::Dumper::Names;
say Dumper $xml_ref;

## Salida
say "Informe: ",            $xml_ref->{id};
say "Motivo de ingreso: ",  $xml_ref->{Motivo}->{Ingreso};
say "Diagnóstico: ",        $xml_ref->{Diagnostico}->{Clinico};
say "Intervención: ",       $xml_ref->{Intervencion};
say "Tratamiento: ",        $xml_ref->{Tratamiento_y_recomendaciones}->{Al_alta};

__END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sale:
Código: Seleccionar todo
$xml_ref = {
             'Diagnostico' => {
                              'Clinico' => '- texto.'
                            },
             'Motivo' => {
                         'Ingreso' => 'texto'
                       },
             'Tratamiento_y_recomendaciones' => {
                                                'Al_alta' => 'texto'
                                              },
             'Intervencion' => 'texto',
             'id' => '2000006',
             'Resumen_historia' => 'texto'
           };

Informe: 2000006
Motivo de ingreso: texto
Diagnóstico: - texto.
Intervención: texto
Tratamiento: texto
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

Anterior

Volver a Básico

¿Quién está conectado?

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

cron