[SP-pm] XML::Simple

Marcio Mello marcio at modapoint.com.br
Fri Dec 4 10:02:56 PST 2009


Obrigado André! 
Vou fazer alguns testes aqui e retorno..
Marcio.
  ----- Original Message ----- 
  From: Andre Carneiro 
  To: saopaulo-pm em mail.pm.org 
  Sent: Friday, December 04, 2009 3:26 PM
  Subject: Re: [SP-pm] XML::Simple


  Grego é?? Blz! Vou tentar traduzir um pouquinho então...

  <code>
  use strict;
  use XML::Simple;
  use Data::Dumper; #Isso vai ajudar vc a entender o que o XML::Simple vai trazer e como vai trazer.

  my $string = '<?xml version="1.0" encoding="utf-8" ?>
                               <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Header>
      <AuthHeader xmlns="vscws">
        <distriID>XXXX</distriID>
        <password>XXXXXX</password>
      </AuthHeader>
    </soap:Header>
    <soap:Body>
      <getUserTransactions xmlns="vscws">
        <controlNumber>XXXXXX</controlNumber>
        <transactionType></transactionType>
        <dateFrom>2009-11-10</dateFrom>
        <dateTo>2009-11-30</dateTo>
      </getUserTransactions>
    </soap:Body>
  </soap:Envelope>';      
    my $ref = undef;    my $obj = XML::Simple->new();    #Tratando possivel erro de parsing    eval{$ref = $obj->XMLin($string);};#Isso transforma o XML em uma estrutura de dados em forma de hashes e arrays... 
    if($@){        print "\nNao foi possivel fazer o parsing: $@\n";    }else{        print Dumper $ref; #Isso mostra a estrutura de dados gerada pelo parsing.        my $xml = XMLout($ref);#Isso converte a estrutura de dados armazenada em $ref para XML novamente. 
                               #Não sei se tem muito sentido isso para você, mas enfim...    }__END__

  </code>


  Quando executar esse script, vai ver algo do tipo: 


  $VAR1 = {
            'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
            'soap:Header' => {
                             'AuthHeader' => {
                                             'xmlns' => 'vscws',
                                             'password' => 'XXXXXX',
                                             'distriID' => 'XXXX'
                                           }
                           },
            'soap:Body' => {
                           'getUserTransactions' => {
                                                    'xmlns' => 'vscws',
                                                    'transactionType' => {},
                                                    'dateFrom' => '2009-11-10',
                                                    'dateTo' => '2009-11-30',
                                                    'controlNumber' => 'XXXXXX'
                                                  }
                         },
            'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
            'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/'
          };

  Aí é só acessar via perl o que você quer. Por exemplo, vamos capturar 'getUserTransactions'

  <code>

              my $getUserTransaction = $xml->{soap.Body}->{getUsertTransaction};

  </code>


  Melhorou?


  2009/12/4 Daniel de Oliveira Mantovani <daniel.oliveira.mantovani em gmail.com>

    2009/12/4 Marcio Mello <marcio em modapoint.com.br>:

    > Olá à todos,
    > Não conheço bem o módulo XML::Simple e não sei como traduzir os dados
    > corretamente.
    > Se alguém puder ajudar, fico grato..
    >
    > A resposta que recebo do servidor está aqui e o código está abaixo:
    >
    > ===========================================================
    > $VAR1 = { 'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
    > 'soap:Body' => { 'getUserTransactionsResponse' => { 'xmlns' => 'vscws',
    > 'getUserTransactionsResult' => { 'VSC' => { 'xmlns' => '',
    > 'userTransactions' => [ { 'Time' => '1:00', 'Limit' => '5', 'DNIS' =>
    > '56012', 'destinationDescription' => "Brasil - S\x{e3}o Paulo - \x{c1}rea 11
    > - Celular", 'Income' => '0.0000', 'controlNumber' => '2414568', 'ANI' =>
    > '1145822125', 'DestinationNumber' => '551199117099', 'Balance' => '-44.024',
    > 'startTime' => '2009-11-27 17:28:45', 'Cost' => '0.89',
    > 'transactionDescription' => 'Termination', 'billing' => 'Limited',
    > 'RealTime' => '0:22' }, { 'Time' => '1:00', 'Limit' => '5', 'DNIS' =>
    > '56012', 'destinationDescription' => 'Brasil - Roc', 'Income' => '0.0000',
    > 'controlNumber' => '2414568', 'ANI' => '1145822125', 'DestinationNumber' =>
    > '551145215888', 'Balance' => '-44.314', 'startTime' => '2009-11-27
    > 17:25:45', 'Cost' => '0.29', 'transactionDescription' => 'Termination',
    > 'billing' => 'Limited', 'RealTime' => '0:19' }, { 'Time' => '1:00', 'Limit'
    > => '5', 'DNIS' => '56012', 'destinationDescription' => 'Brasil - Roc',
    > 'Income' => '0.0000', 'controlNumber' => '2414568', 'ANI' => '1145822125',
    > 'DestinationNumber' => '551145215888', 'Balance' => '-44.604', 'startTime'
    > => '2009-11-27 17:16:30', 'Cost' => '0.29', 'transactionDescription' =>
    > 'Termination', 'billing' => 'Limited', 'RealTime' => '0:24' }, { 'Time' =>
    > '1:00', 'Limit' => '5', 'DNIS' => '56012', 'destinationDescription' =>
    > 'Brasil -', 'Income' => '0.0000', 'controlNumber' => '2414568', 'ANI' =>
    > '1145822125', 'DestinationNumber' => '551164545504', 'Balance' => '-45.494',
    > 'startTime' => '2009-11-27 17:06:44', 'Cost' => '0.89',
    > 'transactionDescription' => 'Termination', 'billing' => 'Limited',
    > 'RealTime' => '0:12' }, { 'Time' => '1:48', 'Limit' => '5', 'DNIS' =>
    > '56012', 'destinationDescription' => 'Brasil - Roc', 'Income' => '0.0000',
    > 'controlNumber' => '2414568', 'ANI' => '1130337016', 'DestinationNumber' =>
    > '551130337005', 'Balance' => '-46.016', 'startTime' => '2009-11-27
    > 12:19:22', 'Cost' => '0.522', 'transactionDescription' => 'Termination',
    > 'billing' => 'Limited', 'RealTime' => '1:43' }, { 'Time' => '1:00', 'Limit'
    > => '5', 'DNIS' => '56012', 'destinationDescription' => "Brasil - S\x{e3}o
    > Paulo - \x{c1}rea 11 - Celular", 'Income' => '0.0000', 'controlNumber' =>
    > '2414568', 'ANI' => '1130337016', 'DestinationNumber' => '551199117099',
    > 'Balance' => '-46.906', 'startTime' => '2009-11-27 12:20:28', 'Cost' =>
    > '0.89', 'transactionDescription' => 'Termination', 'billing' => 'Limited',
    > 'RealTime' => '0:13' }, { 'Time' => '1:00', 'Limit' => '5', 'DNIS' =>
    > '56012', 'destinationDescription' => "Brasil - S\x{e3}o Paulo - \x{c1}rea 11
    > - Celular", 'Income' => '0.0000', 'controlNumber' => '2414568', 'ANI' =>
    > '1130337016', 'DestinationNumber' => '551199117099', 'Balance' => '-47.796',
    > 'startTime' => '2009-11-27 12:07:35', 'Cost' => '0.89',
    > 'transactionDescription' => 'Termination', 'billing' => 'Limited',
    > 'RealTime' => '0:20' }, { 'Time' => '1:00', 'Limit' => '5', 'DNIS' =>
    > '56012', 'destinationDescription' => 'Brasil - Roc', 'Income' => '0.0000',
    > 'controlNumber' => '2414568', 'ANI' => '1130337016', 'DestinationNumber' =>
    > '551130337005', 'Balance' => '-48.086', 'startTime' => '2009-11-27
    > 12:06:08', 'Cost' => '0.29', 'transactionDescription' => 'Termination',
    > 'billing' => 'Limited', 'RealTime' => '0:21' }, { 'Time' => '0:00', 'Limit'
    > => '5', 'DNIS' => {}, 'destinationDescription' => {}, 'Income' => '50',
    > 'controlNumber' => '2414568', 'ANI' => {}, 'DestinationNumber' => {},
    > 'Balance' => '1.914', 'startTime' => '2009-11-26 18:05:36', 'Cost' =>
    > '0.0000', 'transactionDescription' => 'Payment', 'billing' => 'Limited',
    > 'RealTime' => '0:00' }, { 'Time' => '1:00', 'Limit' => '5', 'DNIS' =>
    > '30338031', 'destinationDescription' => 'Brasil - Roc', 'Income' =>
    > '0.0000', 'controlNumber' => '2414568', 'ANI' => '1145822125',
    > 'DestinationNumber' => '551145215888', 'Balance' => '1.624', 'startTime' =>
    > '2009-11-25 18:11:25', 'Cost' => '0.29', 'transactionDescription' =>
    > 'Termination', 'billing' => 'Limited', 'RealTime' => '0:47' }, { 'Time' =>
    > '1:00', 'Limit' => '5', 'DNIS' => '56012', 'destinationDescription' =>
    > 'Brasil - Roc', 'Income' => '0.0000', 'controlNumber' => '2414568', 'ANI' =>
    > '1145822125', 'DestinationNumber' => '551155478001', 'Balance' => '1.334',
    > 'startTime' => '2009-11-25 11:55:47', 'Cost' => '0.29',
    > 'transactionDescription' => 'Termination', 'billing' => 'Limited',
    > 'RealTime' => '0:09' }, { 'Time' => '1:00', 'Limit' => '5', 'DNIS' =>
    > '56012', 'destinationDescription' => 'Brasil - Roc', 'Income' => '0.0000',
    > 'controlNumber' => '2414568', 'ANI' => '1145822125', 'DestinationNumber' =>
    > '551140040435', 'Balance' => '1.044', 'startTime' => '2009-11-25 11:48:00',
    > 'Cost' => '0.29', 'transactionDescription' => 'Termination', 'billing' =>
    > 'Limited', 'RealTime' => '0:07' }, { 'Time' => '1:36', 'Limit' => '5',
    > 'DNIS' => '56012', 'destinationDescription' => 'Brasil - Roc', 'Income' =>
    > '0.0000', 'controlNumber' => '2414568', 'ANI' => '1145822125',
    > 'DestinationNumber' => '551140040435', 'Balance' => '0.58', 'startTime' =>
    > '2009-11-25 11:09:02', 'Cost' => '0.464', 'transactionDescription' =>
    > 'Termination', 'billing' => 'Limited', 'RealTime' => '1:31' }, { 'Time' =>
    > '1:00', 'Limit' => '5', 'DNIS' => '56012', 'destinationDescription' =>
    > 'Brasil - Roc', 'Income' => '0.0000', 'controlNumber' => '2414568', 'ANI' =>
    > '1145822125', 'DestinationNumber' => '551138330767', 'Balance' => '0.29',
    > 'startTime' => '2009-11-25 10:11:35', 'Cost' => '0.29',
    > 'transactionDescription' => 'Termination', 'billing' => 'Limited',
    > 'RealTime' => '0:47' }, { 'Time' => '1:00', 'Limit' => '5', 'DNIS' =>
    > '56012', 'destinationDescription' => 'Brasil - Roc', 'Income' => '0.0000',
    > 'controlNumber' => '2414568', 'ANI' => '1145822125', 'DestinationNumber' =>
    > '551138330767', 'Balance' => '0.0000', 'startTime' => '2009-11-25 09:50:25',
    > 'Cost' => '0.29', 'transactionDescription' => 'Termination', 'billing' =>
    > 'Limited', 'RealTime' => '0:52' } ], 'Val' => { 'UserID' => '2414568' },
    > 'STATUS' => '0' } } } }, 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
    > 'xmlns:soap' => 'http://schemas.xmlsoap.org/soap/envelope/' };
    > =====================================================================
    >
    > use LWP::UserAgent;
    > use HTTP::Request;
    > use XML::Simple;
    > use Data::Dumper;
    >
    > my $message = '<?xml version="1.0" encoding="utf-8"?>
    > <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    > xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    > xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    >   <soap:Header>
    >     <AuthHeader xmlns="vscws">
    >       <distriID>XXXX</distriID>
    >       <password>XXXXXX</password>
    >     </AuthHeader>
    >   </soap:Header>
    >   <soap:Body>
    >     <getUserTransactions xmlns="vscws">
    >       <controlNumber>XXXXXX</controlNumber>
    >       <transactionType></transactionType>
    >       <dateFrom>2009-11-10</dateFrom>
    >       <dateTo>2009-11-30</dateTo>
    >     </getUserTransactions>
    >   </soap:Body>
    > </soap:Envelope>';
    >
    > my $length = length($message);
    >
    > my $userAgent = LWP::UserAgent->new();
    > my $request = HTTP::Request->new(POST =>
    > 'http://200.XXX.XXX.XX:90/ws.asmx');
    > $request->header(SOAPAction => '"vscws/getUserTransactions"');
    > $request->content_type("text/xml; charset=utf-8");
    > $request->content_length($length);
    > $request->content($message);
    >
    > my $response = $userAgent->request($request);
    >
    >   #
    >   # Parseando o resultado (XML) do servidor
    >   #
    >   my $ref = XMLin( $response->content ) or die $!;
    >   my $xml = XMLout( my $hashref );
    >
    >   for ( my $i = $#{ $ref->{getUserTransactions} }; $i > 0; $i-- ) {
    >
    >       $startdate = "${ $ref->{getUserTransactions} }[$i]->{startTime}";
    >       $origem    = "${ $ref->{getUserTransactions} }[$i]->{ANI}";
    >       $destino   = "${ $ref->{getUserTransactions}
    > }[$i]->{DestinationNumber}";
    >       $descrip   = "${ $ref->{getUserTransactions}
    > }[$i]->{destinationDescription}";
    >       $duration  = "${ $ref->{getUserTransactions} }[$i]->{Time}";
    >       $cost      = "${ $ref->{getUserTransactions} }[$i]->{Cost}";
    >
    >    $tabelaprint .= "
    >      <tr>
    >       <td><p align=\"center\"><font face=\"Arial\"
    > size=\"1\"><b>$startdate</b></font></td>
    >       <td><p align=\"center\"><font face=\"Arial\"
    > size=\"1\">$origem</font></td>
    >       <td><p align=\"center\"><font face=\"Arial\"
    > size=\"1\"><b>$destino</b></font></td>
    >       <td><p align=\"center\"><font face=\"Arial\"
    > size=\"1\"><b>$descrip</b></font></td>
    >       <td><p align=\"center\"><font face=\"Arial\"
    > size=\"1\">$duration</font></td>
    >       <td><p align=\"center\"><font face=\"Arial\"
    > size=\"1\">$cost</font></td>
    >    </tr>
    >    ";
    >   }
    >
    > if($response->code == 200) {
    >   print "$tabelaprint";
    > }
    > else {
    >  print $response->error_as_HTML;
    > };

    Outra coisa, você está fazendo o parser do content, e depois que você
    termina você verifica se ele está ok ?

    É ao contrário!

    die unless $response->code == 200
    #Agora você faz o parser aqui!!!

    Você precisa de um carro para chegar em uma cidade, depois disso você
    vai queima-lo, o que seria certo:
    1 - Checar o motor antes de partir ?
    2 - Checar o motor depois que você chegou e não precisa mais do carro ?









    > Obrigado.
    > Marcio Mello.
    > marcio em modapoint.com.br

    > _______________________________________________
    > SaoPaulo-pm mailing list
    > SaoPaulo-pm em pm.org
    > http://mail.pm.org/mailman/listinfo/saopaulo-pm
    >



    --
    Existe dois tipos de pessoas, as que reclamam a vida inteira do que
    fazem, e as que fazem o que nasceram para fazer.
    _______________________________________________
    SaoPaulo-pm mailing list
    SaoPaulo-pm em pm.org
    http://mail.pm.org/mailman/listinfo/saopaulo-pm




  -- 
  André Garcia Carneiro
  Analista/Desenvolvedor Perl





------------------------------------------------------------------------------


  _______________________________________________
  SaoPaulo-pm mailing list
  SaoPaulo-pm em pm.org
  http://mail.pm.org/mailman/listinfo/saopaulo-pm
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20091204/d3eab73b/attachment-0001.html>


More information about the SaoPaulo-pm mailing list