• Publicidad

Problema al tratar de desarmar un 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.

Problema al tratar de desarmar un xml

Notapor willbender » 2012-09-24 13:43 @613

¡Buen día!

Les comento mi problema.

A través de un webserver (siendo yo el cliente) obtengo un xml desde un servidor remoto. El archivo que recibo, teóricamente es un xml pero al darle un dump al archivo en si viene de esta manera

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = {
    'current_page_number' => '1',
    'foreign_remote_system' => {
        'identifier' => 'xxxxxxxxxxx',
        'counter_id' => 'yyyyyyyyyyyy',
        'reference_no' => '000000'
    },
    'last_page_number' => '1',
    'xmlns:xrsi' => 'http://servidorremoto.com',
    'number_matches' => '9',
    'payment_transactions' => {
        'payment_transaction' => [
            {
                'filing_date' => '31/02/99 ',
                'receiver' => {
                    'mobile_details' => {},
                    'name' => {
                        'name_type' => 'D',
                        'last_name' => 'apellido',
                        'first_name' => 'nombre'
                    },
                    'mobile_phone' => {
                        'phone_number' => {}
                    },
                    'address' => {
                        'country_code' => {
                            'iso_code' => {}
                        }
                    }
                },
                'fusion' => {
                    'fusion_status' => 'asdf'
                },
                'pay_status_description' => 'asdf',
                'filing_time' => '23:59:59 ',
                'financials' => {
                    'originators_principal_amount' => 'xxxx'
                },
                'money_transfer_key' => '1234567890',
                'new_mtcn' => '1234561234567890',
                'sender' => {
                    'mobile_details' => {},
                    'name' => {
                        'name_type' => 'D',
                        'last_name' => 'nombre',
                        'first_name' => 'apellido'
                    },
                    'mobile_phone' => {
                        'phone_number' => {}
                    },
                    'address' => {
                        'country_code' => {
                            'iso_code' => {}
                        }
                    }
                },
                'payment_details' => {
                    'originating_country_currency' => {
                        'iso_code' => {
                            'currency_code' => 'xxx',
                            'country_code' => 'xx'
                        }
                    }
                }
            },
            {
                'filing_date' => '31/02/99 ',
                'receiver' => {
                    'name' => {
                        'name_type' => 'D',
                        'last_name' => 'apellido',
                        'first_name' => 'nombre'
                    }
                },
                'fusion' => {
                    'fusion_status' => 'xxx'
                },
                'pay_status_description' => 'xxx',
                'filing_time' => '23:59:59 ',
                'financials' => {
                    'originators_principal_amount' => 'xxxx'
                },
                'money_transfer_key' => 'xxxxxxxxxx',
                'new_mtcn' => 'yyyyyyyyyyyyyyy',
                'sender' => {
                    'name' => {
                        'name_type' => 'D',
                        'last_name' => 'apellido',
                        'first_name' => 'nombre'
                    }
                },
                'payment_details' => {
                    'originating_country_currency' => {
                        'iso_code' => {
                            'currency_code' => 'xxx',
                            'country_code' => 'xx'
                        }
                    }
                }
            },
            {
                'filing_date' => '31/12/2099 ',
                'receiver' => {
                    'name' => {
                        'name_type' => 'D',
                        'last_name' => 'apellido',
                        'first_name' => 'nombre'
                    }
                },
                'fusion' => {
                    'fusion_status' => 'xxx'
                },
                'pay_status_description' => 'xxx',
                'filing_time' => '23:59:59',
                'financials' => {
                    'originators_principal_amount' => 'xxx'
                },
                'money_transfer_key' => 'xxxxxxxxxxx',
                'new_mtcn' => 'xxxxxxxxxxxxxxx',
                'sender' => {
                    'name' => {
                        'name_type' => 'D',
                        'last_name' => 'apellido',
                        'first_name' => 'nombre'
                    }
                },
                'payment_details' => {
                    'originating_country_currency' => {
                        'iso_code' => {
                            'currency_code' => 'xxx',
                            'country_code' => 'xx'
                        }
                    }
                }
            }
        ]
    }
};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


El problema es que necesito obtener cada valor individual de cada elemento de la trama, y tengo problemas para esto ya que si se dan cuenta, después de la llave payment_transaction empieza un "[" y luego se abre "{" para empezar una sección de lo que necesito; se cierra nuevamente con "}" y vuelve a abrir otro de igual manera. Y así pueden ser n secciones entre '{}' de este tipo de datos en los cuales las variables tienen la misma etiqueta.

Ya tengo esta parte del código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.   foreach my $Key(  keys %$dataxml) {
  2.       my $valor= $dataxml->{$Key};
  3.       switch($Key){
  4.           case /current_page_number/ {
  5.               $current_page_number=$valor;
  6.               print "\ncurrent_page_number=".$current_page_number."\n";
  7.           }
  8.           case /foreign_remote_system/ {
  9.               foreach my $Key2(keys %$valor) {
  10.                   my $valor2= $valor->{$Key2};
  11.                   if ($Key2 eq 'identifier'){
  12.                   print "identifier=".$valor2."\n";
  13.               }
  14.                   if ($Key2 eq 'counter_id'){
  15.                       print "counter_id=".$valor2."\n";
  16.                   }
  17.                   if ($Key2 eq 'reference_no'){
  18.                       print "reference_no=".$valor2."\n";
  19.                   }
  20.               }
  21.           }
  22.     case /last_page_number/ {
  23.               $last_page_number=$valor;
  24.               print "last_page_number=".$last_page_number."\n";
  25.           }
  26.           case /number_matches/ {
  27.               $number_matches=$valor;
  28.               print "number_matches=".$number_matches."\n";
  29.           }
  30.           case /payment_transactions/{
  31.               print "-----------------------------------payment_transactions----------------------------\n";
  32.               foreach my $Key2(  keys %$valor) {
  33.                   my $valor2= $valor->{$Key2};
  34.                   print "-----------------------------------". $Key2 . "------------------------\n\n\n";
  35.                   #print " Valor2: " . $valor2. "\n";                                                            
  36.                   foreach my $Key3(keys %$valor2) {
  37.                       my $valor3= $valor2->[$Key3];
  38.                       print "$Key3 \n";
  39.                   }
  40.               }
  41.           }
  42.       }
  43.   }
  44. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


pero me da este problema:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
current_page_number=1
identifier=xxxxxxxxxxx
counter_id=xxxxxxxxxxx
reference_no=xxxxxx
last_page_number=1
number_matches=9
-----------------------------------payment_transactions----------------------------
-----------------------------------payment_transaction------------------------


Pseudo-hashes are deprecated at sergio.pl line 137.
Argument "\x{66}\x{69}..." isn't numeric in array element at sergio.pl line 138.
filing_date
Argument "\x{72}\x{65}..." isn't numeric in array element at sergio.pl line 138.
receiver
Argument "\x{66}\x{75}..." isn't numeric in array element at sergio.pl line 138.
fusion
Argument "\x{70}\x{61}..." isn't numeric in array element at sergio.pl line 138.
pay_status_description
Argument "\x{66}\x{69}..." isn't numeric in array element at sergio.pl line 138.
filing_time
Argument "\x{66}\x{69}..." isn't numeric in array element at sergio.pl line 138.
financials
Argument "\x{6d}\x{6f}..." isn't numeric in array element at sergio.pl line 138.
money_transfer_key
Argument "\x{6e}\x{65}..." isn't numeric in array element at sergio.pl line 138.
new_mtcn
Argument "\x{73}\x{65}..." isn't numeric in array element at sergio.pl line 138.
sender
Argument "\x{70}\x{61}..." isn't numeric in array element at sergio.pl line 138.
payment_details
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Me pueden ayudar para ver cómo recorrer las secciones de este xml y poder colocarle una variable a cada dato que necesito? Gracias por la ayuda. Éxitos.
Última edición por explorer el 2012-09-24 17:38 @777, editado 3 veces en total
Razón: Marcas de código Perl
willbender
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2012-07-16 17:22 @765
Ubicación: Guatemala

Publicidad

Re: Problema al tratar de desarmar un xml

Notapor explorer » 2012-09-24 18:02 @793

Si haces un dump y sale una estructura perl compleja, es que el xml ha sido traducido a esa estructura. No sabemos con qué módulo lo has hecho, pero, ahora da igual.

El dump tiene la ventaja de enseñarnos cómo es la estructura: si es un array dentro de un hash, cómo son los elementos de los array...

En tu caso, solo hay que seguir lo que los caracteres '{}' y '[]' marcan.

(He quitado una línea 'country_code' => 'xx' que estaba repetida, hacia el final.)

Con el siguiente programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.14;
  3.  
  4. my $xml = {
  5.     'current_page_number' => '1',
  6.     'foreign_remote_system' => {
  7.         'identifier' => 'xxxxxxxxxxx',
  8.         'counter_id' => 'yyyyyyyyyyyy',
  9.         'reference_no' => '000000'
  10.     },
  11.     'last_page_number' => '1',
  12.     'xmlns:xrsi' => 'http://servidorremoto.com',
  13.     'number_matches' => '9',
  14.     'payment_transactions' => {
  15.         'payment_transaction' => [
  16.             {
  17.                 'filing_date' => '31/02/99 ',
  18.                 'receiver' => {
  19.                     'mobile_details' => {},
  20.                     'name' => {
  21.                         'name_type' => 'D',
  22.                         'last_name' => 'apellido',
  23.                         'first_name' => 'nombre'
  24.                     },
  25.                     'mobile_phone' => {
  26.                         'phone_number' => {}
  27.                     },
  28.                     'address' => {
  29.                         'country_code' => {
  30.                             'iso_code' => {}
  31.                         }
  32.                     }
  33.                 },
  34.                 'fusion' => {
  35.                     'fusion_status' => 'asdf'
  36.                 },
  37.                 'pay_status_description' => 'asdf',
  38.                 'filing_time' => '23:59:59 ',
  39.                 'financials' => {
  40.                     'originators_principal_amount' => 'xxxx'
  41.                 },
  42.                 'money_transfer_key' => '1234567890',
  43.                 'new_mtcn' => '1234561234567890',
  44.                 'sender' => {
  45.                     'mobile_details' => {},
  46.                     'name' => {
  47.                         'name_type' => 'D',
  48.                         'last_name' => 'nombre',
  49.                         'first_name' => 'apellido'
  50.                     },
  51.                     'mobile_phone' => {
  52.                         'phone_number' => {}
  53.                     },
  54.                     'address' => {
  55.                         'country_code' => {
  56.                             'iso_code' => {}
  57.                         }
  58.                     }
  59.                 },
  60.                 'payment_details' => {
  61.                     'originating_country_currency' => {
  62.                         'iso_code' => {
  63.                             'currency_code' => 'xxx',
  64.                             'country_code' => 'xx'
  65.                         }
  66.                     }
  67.                 }
  68.             },
  69.             {
  70.                 'filing_date' => '31/02/99 ',
  71.                 'receiver' => {
  72.                     'name' => {
  73.                         'name_type' => 'D',
  74.                         'last_name' => 'apellido',
  75.                         'first_name' => 'nombre'
  76.                     }
  77.                 },
  78.                 'fusion' => {
  79.                     'fusion_status' => 'xxx'
  80.                 },
  81.                 'pay_status_description' => 'xxx',
  82.                 'filing_time' => '23:59:59 ',
  83.                 'financials' => {
  84.                     'originators_principal_amount' => 'xxxx'
  85.                 },
  86.                 'money_transfer_key' => 'xxxxxxxxxx',
  87.                 'new_mtcn' => 'yyyyyyyyyyyyyyy',
  88.                 'sender' => {
  89.                     'name' => {
  90.                         'name_type' => 'D',
  91.                         'last_name' => 'apellido',
  92.                         'first_name' => 'nombre'
  93.                     }
  94.                 },
  95.                 'payment_details' => {
  96.                     'originating_country_currency' => {
  97.                         'iso_code' => {
  98.                             'currency_code' => 'xxx',
  99.                             'country_code' => 'xx'
  100.                         }
  101.                     }
  102.                 }
  103.             },
  104.             {
  105.                 'filing_date' => '31/12/2099 ',
  106.                 'receiver' => {
  107.                     'name' => {
  108.                         'name_type' => 'D',
  109.                         'last_name' => 'apellido',
  110.                         'first_name' => 'nombre'
  111.                     }
  112.                 },
  113.                 'fusion' => {
  114.                     'fusion_status' => 'xxx'
  115.                 },
  116.                 'pay_status_description' => 'xxx',
  117.                 'filing_time' => '23:59:59',
  118.                 'financials' => {
  119.                     'originators_principal_amount' => 'xxx'
  120.                 },
  121.                 'money_transfer_key' => 'xxxxxxxxxxx',
  122.                 'new_mtcn' => 'xxxxxxxxxxxxxxx',
  123.                 'sender' => {
  124.                     'name' => {
  125.                         'name_type' => 'D',
  126.                         'last_name' => 'apellido',
  127.                         'first_name' => 'nombre'
  128.                     }
  129.                 },
  130.                 'payment_details' => {
  131.                     'originating_country_currency' => {
  132.                         'iso_code' => {
  133.                             'currency_code' => 'xxx',
  134.                             'country_code' => 'xx',
  135.                         }
  136.                     }
  137.                 }
  138.             }
  139.         ]
  140.     }
  141. };
  142.  
  143. my $payment_transactions = $xml->{payment_transactions}->{payment_transaction};  # Acceso al array de transacciones de pagos
  144.  
  145. print "-----------------------------------payment_transactions----------------------------\n";
  146. for my $payment_transaction ( @$payment_transactions ) {         # recorremos todos los elementos del array
  147.  
  148.     while (my($clave, $valor) =  each(%$payment_transaction)) {  # cada elemento es un hash, que recorremos
  149.         my $es_referencia = ref $valor;                          # si el $valor
  150. #       say "$valor => $es_referencia";
  151.         if ($es_referencia eq '') {                              # no es una referencia
  152.             say "$clave => $valor";                              # lo sacamos en pantalla
  153.         }
  154.     }
  155.  
  156.     say '-' x 40;
  157. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

obtenemos
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
-----------------------------------payment_transactions----------------------------
filing_date => 31/02/99
pay_status_description => asdf
filing_time => 23:59:59
money_transfer_key => 1234567890
new_mtcn => 1234561234567890
----------------------------------------
filing_date => 31/02/99
pay_status_description => xxx
filing_time => 23:59:59
money_transfer_key => xxxxxxxxxx
new_mtcn => yyyyyyyyyyyyyyy
----------------------------------------
filing_date => 31/12/2099
pay_status_description => xxx
filing_time => 23:59:59
money_transfer_key => xxxxxxxxxxx
new_mtcn => xxxxxxxxxxxxxxx
----------------------------------------
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Este es un caso sencillo, porque solo imprimimos los pares clave/valor que correspondan a valores escalares normales. Si quisiéramos acceder a valores más complicados (cuando $valor es a su vez una referencia a un hash) entonces deberíamos tener un nivel más de profundidad de acceso (otra indirección/otro bucle for/otro bucle while).

Una cosa más: no uses el módulo Switch: está plagado de errores. Usa given/when de los Perl modernos.
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

Re: Problema al tratar de desarmar un xml

Notapor willbender » 2012-09-26 11:36 @525

Gracias por la ayuda explorer. Probaré con lo que colocaste y te comento gracias.
willbender
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2012-07-16 17:22 @765
Ubicación: Guatemala

Re: Problema al tratar de desarmar un xml

Notapor willbender » 2012-10-01 13:08 @589

Buen día, explorer. No logro colocar el siguiente nivel, es decir, no logro desplegar la información que trae el siguiente nivel.

¿Podrías ayudarme?, ya que aparte de lo que te coloqué con anterioridad sé me olvido comentar que debo capturar toda la información que traiga el xml y procesarlo.

¿Me puedes explicar de qué manera puedo capturar estos datos ya que tengo un socket server esperando una trama de información con estos datos capturados?

Gracias, éxitos.
willbender
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2012-07-16 17:22 @765
Ubicación: Guatemala

Re: Problema al tratar de desarmar un xml

Notapor willbender » 2012-10-01 13:20 @597

puntualmente te coloco el codigo segun lo que me explicabas arriba

(otra indirección/otro bucle for/otro bucle while)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  
  2.  
  3. my $lvl1 = $dataxml->{payment_transactions}->{payment_transaction};
  4.  
  5.   print "-----------------------------------payment_transactions----------------------------\n";
  6.   for my $payment_transaction ( @$lvl1 ) {                             # recorremos todos los elementos del array
  7.       while (my($clave, $valor) =  each(%$payment_transaction)) {      # cada elemento es un hash, que recorremos    
  8.           my $es_referencia = ref $valor;                        
  9. i         if ($es_referencia eq '') {                                  # no es una referencia
  10.           print "$clave => $valor\n";                              # lo sacamos en pantalla
  11.           }
  12.           for my $receiver ( @$clave ) {
  13.               while (my($clave2, $valor2) =  each(%$receiver)) {
  14.                   my $es_referencia2 = ref $valor2;
  15.                   if ($es_referencia2 eq '') {
  16.                       print "$clave2 => $valor2\n";
  17.                   }
  18.               }
  19.           }
  20.  
  21.       }
  22.  
  23.       print '-' x 40 ;
  24.       print "\n";
  25.   }
  26. }
  27.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


mi duda es la indireccion a la que te refieres, es q debo hacer referencia a mi variable que es hash? y esta bien que este debajo del while el siguiente nivel??

gracias
willbender
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2012-07-16 17:22 @765
Ubicación: Guatemala

Re: Problema al tratar de desarmar un xml

Notapor explorer » 2012-10-01 13:33 @606

Si nos muestras el código que tienes, vemos dónde está fallando...

A lo mejor es más cómodo usar XML::Twig.

¿De cuántos niveles de profundidad necesitas leer?
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

Re: Problema al tratar de desarmar un xml

Notapor willbender » 2012-10-01 13:51 @618

Ok, voy de esta manera. El xml que obtengo es el mismo que está publicado antes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $xml = {
  2.     'current_page_number' => '1',
  3.     'foreign_remote_system' => {
  4.         'identifier' => 'xxxxxxxxxxx',
  5.         'counter_id' => 'yyyyyyyyyyyy',
  6.         'reference_no' => '000000'
  7.     },
  8.     'last_page_number' => '1',
  9.     'xmlns:xrsi' => 'http://servidorremoto.com',
  10.     'number_matches' => '9',
  11.     'payment_transactions' => {
  12.         'payment_transaction' => [
  13.             {
  14.                 'filing_date' => '31/02/99 ',
  15.                 'receiver' => {
  16.                     'mobile_details' => {},
  17.                     'name' => {
  18.                         'name_type' => 'D',
  19.                         'last_name' => 'apellido',
  20.                         'first_name' => 'nombre'
  21.                     },
  22.                     'mobile_phone' => {
  23.                         'phone_number' => {}
  24.                     },
  25.                     'address' => {
  26.                         'country_code' => {
  27.                             'iso_code' => {}
  28.                         }
  29.                     }
  30.                 },
  31.                 'fusion' => {
  32.                     'fusion_status' => 'asdf'
  33.                 },
  34.                 'pay_status_description' => 'asdf',
  35.                 'filing_time' => '23:59:59 ',
  36.                 'financials' => {
  37.                     'originators_principal_amount' => 'xxxx'
  38.                 },
  39.                 'money_transfer_key' => '1234567890',
  40.                 'new_mtcn' => '1234561234567890',
  41.                 'sender' => {
  42.                     'mobile_details' => {},
  43.                     'name' => {
  44.                         'name_type' => 'D',
  45.                         'last_name' => 'nombre',
  46.                         'first_name' => 'apellido'
  47.                     },
  48.                     'mobile_phone' => {
  49.                         'phone_number' => {}
  50.                     },
  51.                     'address' => {
  52.                         'country_code' => {
  53.                             'iso_code' => {}
  54.                         }
  55.                     }
  56.                 },
  57.                 'payment_details' => {
  58.                     'originating_country_currency' => {
  59.                         'iso_code' => {
  60.                             'currency_code' => 'xxx',
  61.                             'country_code' => 'xx'
  62.                         }
  63.                     }
  64.                 }
  65.             },
  66.             {
  67.                 'filing_date' => '31/02/99 ',
  68.                 'receiver' => {
  69.                     'name' => {
  70.                         'name_type' => 'D',
  71.                         'last_name' => 'apellido',
  72.                         'first_name' => 'nombre'
  73.                     }
  74.                 },
  75.                 'fusion' => {
  76.                     'fusion_status' => 'xxx'
  77.                 },
  78.                 'pay_status_description' => 'xxx',
  79.                 'filing_time' => '23:59:59 ',
  80.                 'financials' => {
  81.                     'originators_principal_amount' => 'xxxx'
  82.                 },
  83.                 'money_transfer_key' => 'xxxxxxxxxx',
  84.                 'new_mtcn' => 'yyyyyyyyyyyyyyy',
  85.                 'sender' => {
  86.                     'name' => {
  87.                         'name_type' => 'D',
  88.                         'last_name' => 'apellido',
  89.                         'first_name' => 'nombre'
  90.                     }
  91.                 },
  92.                 'payment_details' => {
  93.                     'originating_country_currency' => {
  94.                         'iso_code' => {
  95.                             'currency_code' => 'xxx',
  96.                             'country_code' => 'xx'
  97.                         }
  98.                     }
  99.                 }
  100.             },
  101.             {
  102.                 'filing_date' => '31/12/2099 ',
  103.                 'receiver' => {
  104.                     'name' => {
  105.                         'name_type' => 'D',
  106.                         'last_name' => 'apellido',
  107.                         'first_name' => 'nombre'
  108.                     }
  109.                 },
  110.                 'fusion' => {
  111.                     'fusion_status' => 'xxx'
  112.                 },
  113.                 'pay_status_description' => 'xxx',
  114.                 'filing_time' => '23:59:59',
  115.                 'financials' => {
  116.                     'originators_principal_amount' => 'xxx'
  117.                 },
  118.                 'money_transfer_key' => 'xxxxxxxxxxx',
  119.                 'new_mtcn' => 'xxxxxxxxxxxxxxx',
  120.                 'sender' => {
  121.                     'name' => {
  122.                         'name_type' => 'D',
  123.                         'last_name' => 'apellido',
  124.                         'first_name' => 'nombre'
  125.                     }
  126.                 },
  127.                 'payment_details' => {
  128.                     'originating_country_currency' => {
  129.                         'iso_code' => {
  130.                             'currency_code' => 'xxx',
  131.                             'country_code' => 'xx',
  132.                         }
  133.                     }
  134.                 }
  135.             }
  136.         ]
  137.     }
  138. };
  139.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Ingresa a esta parte:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     my $xml2 = new XML::Simple();
  2.     $dataxml = $xml2->XMLin($xml);
  3.  
  4.     my $lvl1 = $dataxml->{payment_transactions}->{payment_transaction};
  5.  
  6. ###################primer nivel#########################################################################
  7.     print "-----------------------------------payment_transactions----------------------------\n";
  8.     for my $payment_transaction (@$lvl1) {    # recorremos todos los elementos del array
  9.         while ( my ( $clave, $valor ) = each(%$payment_transaction) ) {    # cada elemento es un hash, que recorremos
  10.             my $es_referencia = ref $valor;                                # si el $valor
  11.             if ( $es_referencia eq '' ) {                                  # no es una referencia
  12.                 print "$clave => $valor\n";                                # lo sacamos en pantalla
  13.             }
  14.             else {
  15.                 print "$valor";
  16.             }
  17.             for my $receiver (%$clave) {
  18.                 while ( my ( $clave2, $valor2 ) = each(%$clave) ) {
  19.  
  20.                     my $es_referencia2 = ref $valor2;
  21.                     if ( $es_referencia2 eq '' ) {
  22.                         print "$clave2 => $valor2\n";
  23.                     }
  24.                 }
  25.             }
  26.             print '-' x 40;
  27.             print "\n";
  28.         }
  29.     }
  30.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y despliega esto al ejecutar el perl
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
-----------------------------------payment_transactions----------------------------
filing_date => 09/07/12
receiver
fusion
pay_status_description => W/C
filing_time => 01:28:18
financials
money_transfer_key => 2318951301
new_mtcn => 1225179721184729
sender
payment_details
----------------------------------------
filing_date => 09/07/12
receiver
fusion
pay_status_description => W/C
filing_time => 01:27:44
financials
money_transfer_key => 2318951300
new_mtcn => 1225179721184655
sender
payment_details
----------------------------------------
filing_date => 09/07/12
receiver
fusion
pay_status_description => W/C
filing_time => 01:26:30
financials
money_transfer_key => 2318951299
new_mtcn => 1225179721184581
sender
payment_details
----------------------------------------
filing_date => 09/07/12
receiver
fusion
pay_status_description => W/C
filing_time => 01:25:59
financials
money_transfer_key => 2318951298
new_mtcn => 1225179721184518
sender
payment_details
----------------------------------------
filing_date => 09/07/12
receiver
fusion
pay_status_description => W/C
filing_time => 01:25:17
financials
money_transfer_key => 2318951297
new_mtcn => 1225179721184444
sender
payment_details
----------------------------------------
filing_date => 09/07/12
receiver
fusion
pay_status_description => W/C
filing_time => 01:24:31
financials
money_transfer_key => 2318843308
new_mtcn => 1225179721184370
sender
payment_details
----------------------------------------
filing_date => 09/07/12
receiver
fusion
pay_status_description => W/C
filing_time => 01:23:28
financials
money_transfer_key => 2318843307
new_mtcn => 1225179721184307
sender
payment_details
----------------------------------------
filing_date => 09/04/12
receiver
fusion
pay_status_description => W/C
filing_time => 07:06:50
financials
money_transfer_key => 2318843305
new_mtcn => 1224879721163517
sender
payment_details
----------------------------------------
filing_date => 08/31/12
receiver
fusion
pay_status_description => W/C
filing_time => 02:02:33
financials
money_transfer_key => 2318843303
new_mtcn => 1224479721156724
sender
payment_details
----------------------------------------
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Te explico. Por ejemplo, debajo de "receiver" viene otros subniveles. Uno de ellos "name" y debajo de él vienen otros más donde está la información que necesito capturar.

Es más, te comento: necesito capturar todos los valores que trae el xml completo. También te comento: en el xml solo puede venir un bloque de información o varios como el del ejemplo.

Agradecería me ayudaras con esto ya no sé qué más hacerle. Gracias.
willbender
Perlero nuevo
Perlero nuevo
 
Mensajes: 24
Registrado: 2012-07-16 17:22 @765
Ubicación: Guatemala

Re: Problema al tratar de desarmar un xml

Notapor explorer » 2012-10-01 17:14 @759

Estoy suponiendo que no habrás cometido el error, en la línea 2, de darle a XMLin() la estructura $xml que pones antes... Son cosas distintas, el XML que la estructura que XMLin() genera...

Todo el bucle 17 corresponde a la impresión de datos del siguiente nivel. Así que debe estar dentro de las llaves 14 a 16.

El bucle, además, no está bien construido. Tienes:

for my $receiver (%$clave) {

cuando antes deberías ver si lo que contiene $valor es una referencia a un array o a un hash. Y según lo que sea, habrá que hacer un tipo de bucle u otro.

Por ejemplo, si sabemos que $valor es una referencia a un hash, entonces recorremos su contenido como si fuera un hash normal:

while ( my ( $clave2, $valor2 ) = each(%$valor) ) {

En cambio, si fuera un array, sería así:

for my $valor2 (@$valor) {

Creo que vendría bien que adjuntaras en el siguiente mensaje un XML tipo de los que tienes que tratar.

No pongas un XML completo, sino el más reducido que puedas. Y en los casos en los que puede haber más de un elemento, pon siempre dos, no ponga solo uno (el problema está en XML::Simple, que se comporta de forma distinta cuando se encuentra un elemento (crea un hash de hash) que varios elementos (crea un array de hash). Esos detalles necesitamos saberlos para poner correctamente los argumentos a XML::Simple.

Si no puedes poner ese XML de forma pública, mándamelo por el servicio de mensajería interno de estos foros.
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


Volver a Intermedio

¿Quién está conectado?

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