Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rpa

[Resolvido] xml para php

Recommended Posts

Ola pessoal, estou com um problema aqui que me empacou. Nunca trabalhei com xml_parser e to penando pra extrair os dados em forma de variavel:

 

Veja o que tenho:

 

$xml_parser = xml_parser_create();
      xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
      xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
      xml_parse_into_struct($xml_parser, $result, $vals, $index);
      xml_parser_free($xml_parser);

 

Se eu uso print_r($result); eu consigo ver os dados do xml

 

se eu uso print_r($vals); eu vejo a estrutura, como por exemplo:

Array
(
   [0] => Array
       (
           [tag] => Result
           [type] => open
           [level] => 1
       )

   [1] => Array
       (
           [tag] => TransTime
           [type] => complete
           [level] => 2
           [value] => Mon Jul 27 12:31:09 EDT 2009
       )

A minha questão é: como faço para extrair por exemplo algo do tipo $vals['o_campo_desejado_aqui'] ?

 

Alguem poderia me dar umas dicas, to de cabelo em pe por aqui.

 

Obrigado a todos.

Ricardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola pessoal, estou com um problema aqui que me empacou. Nunca trabalhei com xml_parser e to penando pra extrair os dados em forma de variavel:

 

Alguem poderia me dar umas dicas, to de cabelo em pe por aqui.

 

Bom amigo, se não for realmente necessário usar xml_parser então talvez você possa usar DOM e XPath, é a forma mais rápida de se acessar um valor em um XML:

 

imagine o seguinte arquivo.xml

<?xml version="1.0" encoding="utf-8"?>
<dados>
    <linha id='1'>
        <coluna name='nome'>João Batista Neto</coluna>
        <coluna name='valor'>27</coluna>
    </linha>
    <linha id='2'>
        <coluna name='nome'>Neto</coluna>
        <coluna name='valor'>100</coluna>
    </linha>
    <linha id='3'>
        <coluna name='nome'>Teste</coluna>
        <coluna name='valor'>1</coluna>
    </linha>
</dados>

Para acessar dentro da linha com id='2' a coluna com name='nome'

$dom = new DOMDocument();
$dom->load( "arquivo.xml" );

$xpath = new DOMXPath( $dom );

$nome = $xpath->query( sprintf( "//dados/linha[ @id=%d ]/coluna[ @name = 'nome' ]/text()" , 2 ) )->item( 0 )->nodeValue;
$valor = $xpath->query( sprintf( "//dados/linha[ @id=%d ]/coluna[ @name = 'valor' ]/text()" , 2 ) )->item( 0 )->nodeValue;

printf( "O nome é %s e o valor é %d\n" ,  $nome , $valor ); //O nome é Neto e o valor é 100

Dessa forma, apenas usando XPath você consegue contar, somar, filtrar e buscar qualquer informação em qualquer parte do XML:

 

$valor = $xpath->evaluate( "count(//dados/linha)" );

printf( "Existem %d linhas de dados\n" , $valor ); //Existem 3 linhas de dados

$valor = $xpath->evaluate( "sum(//dados/linha/coluna[ @name = 'valor' ])" );

printf( "A soma de todos os valores é %d\n" , $valor ); //A soma de todos os valores é 128

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola João,

 

Então, o problema é que não tenho opção, tenho que usar o xml_parser pois a resposta vem do servidor e como é uma rotina de pagamento online(cartão de crédito), tenho que manipular esse retorno pra fazer algumas operações internas no nosso site.

 

No caso apenas tenho que pegar um valor e fazer um simples if, mas pra pegar essa variável que esta sendo o problema, se tiver alguma dica extra fico muito agradecido.

 

 

Muito obrigado.

Ricardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, o problema é que não tenho opção, tenho que usar o xml_parser pois a resposta vem do servidor e como é uma rotina de pagamento online(cartão de crédito), tenho que manipular esse retorno pra fazer algumas operações internas no nosso site.

 

No caso apenas tenho que pegar um valor e fazer um simples if, mas pra pegar essa variável que esta sendo o problema, se tiver alguma dica extra fico muito agradecido.

 

Você tem um sample do XML ai ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola, tenho sim:

 

Abaixo, tenho que pegar este retorno:

 

[4] => Array
       (
           [tag] => Approved
           [type] => complete
           [level] => 2
           [value] => APPROVED
       )

 

em caso APPROVED, ai prossigo com o meu checkout

 

Obrigado!

Ricardo

 

 

Array
(
   [0] => Array
       (
           [tag] => Result
           [type] => open
           [level] => 1
       )

   [1] => Array
       (
           [tag] => TransTime
           [type] => complete
           [level] => 2
           [value] => Mon Jul 27 14:48:43 EDT 2009
       )

   [2] => Array
       (
           [tag] => OrderID
           [type] => complete
           [level] => 2
           [value] => 2009072714484309874
       )

   [3] => Array
       (
           [tag] => TransactionType
           [type] => complete
           [level] => 2
           [value] => SALE
       )

   [4] => Array
       (
           [tag] => Approved
           [type] => complete
           [level] => 2
           [value] => APPROVED
       )

   [5] => Array
       (
           [tag] => ReturnCode
           [type] => complete
           [level] => 2
           [value] => Y:123456:0abcdef:M:X:NNN
       )

   [6] => Array
       (
           [tag] => ErrMsg
           [type] => complete
           [level] => 2
       )

   [7] => Array
       (
           [tag] => TaxTotal
           [type] => complete
           [level] => 2
           [value] => 0.00
       )

   [8] => Array
       (
           [tag] => ShipTotal
           [type] => complete
           [level] => 2
           [value] => 0.00
       )

   [9] => Array
       (
           [tag] => SubTotal
           [type] => complete
           [level] => 2
           [value] => 10.00
       )

   [10] => Array
       (
           [tag] => FullTotal
           [type] => complete
           [level] => 2
           [value] => 10.00
       )

   [11] => Array
       (
           [tag] => PaymentType
           [type] => complete
           [level] => 2
           [value] => CC
       )

   [12] => Array
       (
           [tag] => CardNumber
           [type] => complete
           [level] => 2
           [value] => ......1111
       )

   [13] => Array
       (
           [tag] => TransRefNumber
           [type] => complete
           [level] => 2
           [value] => 1be1a8fd42c45f72
       )

   [14] => Array
       (
           [tag] => CardIDResult
           [type] => complete
           [level] => 2
           [value] => M
       )

   [15] => Array
       (
           [tag] => AVSResult
           [type] => complete
           [level] => 2
           [value] => X
       )

   [16] => Array
       (
           [tag] => CardAuthNumber
           [type] => complete
           [level] => 2
           [value] => 123456
       )

   [17] => Array
       (
           [tag] => CardRefNumber
           [type] => complete
           [level] => 2
           [value] => 0abcdef
       )

   [18] => Array
       (
           [tag] => CardType
           [type] => complete
           [level] => 2
           [value] => VISA
       )

 

 

apenas complementando, tenho esta instrução que não entendi direito:

 

// $vals = array of XML tags

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola, tenho sim:

 

Abaixo, tenho que pegar este retorno:

 

Certo amigão, mas no formato XML.

É mais fácil p te ajudar se tiver o XML, no formato que você enviou vou ter que voltar para XML para só então fazer experimentos...

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, ai que mora o perigo, não tem: eu faço um post para o servidor deles e eles retornam uma resposta do servidor. Olha o que tenho aqui deles:

 

Obrigado

Ricardo

 

//aqui nest XPost eu passo as variaveis do cartao

$XPost = '
<Order>
<StoreID>teststore</StoreID>
<Passphrase>psigate1234</Passphrase>
<Subtotal>'.$_POST["Subtotal"].'</Subtotal>
       <PaymentType>CC</PaymentType>
<CardAction>0</CardAction>
<CardNumber>'.$_POST["CardNumber"].'</CardNumber>
<CardExpMonth>'.$_POST["CardExpMonth"].'</CardExpMonth>
<CardExpYear>'.$_POST["CardExpYear"].'</CardExpYear>
<CustomerIP>'.$_POST["CustomerIP"].'</CustomerIP>
<CardIDNumber>'.$_POST["CardIDNumber"].'</CardIDNumber>

</Order>';

//tem que mandar pra essa url
$url = "https://dev.psigate.com:7989/Messenger/XMLMessenger";

$ch = curl_init();    // initialize curl handle
curl_setopt($ch, CURLOPT_URL,$url); // set url to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); // return into a variable
curl_setopt($ch, CURLOPT_TIMEOUT, 40); // times out after 40s
curl_setopt($ch, CURLOPT_POSTFIELDS, $XPost); // add POST fields

$result = curl_exec($ch); // run the whole process
if (curl_errno($ch)) {
  print curl_error($ch);
} else {
  curl_close($ch);
}

echo $result.'<br/>'; //contains response from server << aqui vem uma linha com a resposta do servidor com detalhes da compra, se foi aprovado ou nao..A partir daqui que to empacado


// use XML Parser on $result, and your set!
      $xml_parser = xml_parser_create();
      xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
      xml_parser_set_option($xml_parser,XML_OPTION_SKIP_WHITE,1);
      xml_parse_into_struct($xml_parser, $result, $vals, $index);
      xml_parser_free($xml_parser);
// $vals = array of XML tags.  Go get em!

Compartilhar este post


Link para o post
Compartilhar em outros sites

echo $result.'<br/>'; //contains response from server << aqui vem uma linha com a resposta do servidor com detalhes da compra, se foi aprovado ou nao..A partir daqui que to empacado

 

hehe, É esse kara que precisamos, ele contém um XML válido e que segue um padrão bem definido.

de um var_dump( $result ) que com esse conteúdo conseguiremos matar seu problema.

 

PS. Retire os dados sensitivos do resultado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja só, acho que eles devem ter algo que protege esse acesso, veja o que retorna:

 

Mon Jul 27 15:16:08 EDT 2009

2009072715160809878

SALE

APPROVED

Y:123456:0abcdef:M:X:NNN

 

0.00

0.00

10.00

10.00

CC

......1111

1be1a8fd6b16f196

M

X

123456

0abcdef

VISA

 

 

 

 

 

 

 

 

 

 

 

echo $result.'<br/>'; //contains response from server << aqui vem uma linha com a resposta do servidor com detalhes da compra, se foi aprovado ou nao..A partir daqui que to empacado

 

hehe, É esse kara que precisamos, ele contém um XML válido e que segue um padrão bem definido.

de um var_dump( $result ) que com esse conteúdo conseguiremos matar seu problema.

 

PS. Retire os dados sensitivos do resultado

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja só, acho que eles devem ter algo que protege esse acesso, veja o que retorna:

 

Se você pegou esse resultado da tela do navegador, você pegou interpretado.

O navegador interpreta as tags XML e mostra só o conteúdo text.

Abra o código fonte da página que você pegou esse conteúdo que o XML vai estar lá.

 

:D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal, ta la. Nunca tinha trabalhado com xml pra manipular o resultado antes...

 

O que busco pra comparar e esta linha: <Approved>APPROVED</Approved>

 

<?xml version="1.0" encoding="UTF-8"?>
<Result>
<TransTime>Mon Jul 27 15:16:08 EDT 2009</TransTime>
<OrderID>2009072715160809878</OrderID>
<TransactionType>SALE</TransactionType>
<Approved>APPROVED</Approved>
<ReturnCode>Y:123456:0abcdef:M:X:NNN</ReturnCode>
<ErrMsg></ErrMsg>
<TaxTotal>0.00</TaxTotal>
<ShipTotal>0.00</ShipTotal>
<SubTotal>10.00</SubTotal>
<FullTotal>10.00</FullTotal>
<PaymentType>CC</PaymentType>
<CardNumber>......1111</CardNumber>
<TransRefNumber>1be1a8fd6b16f196</TransRefNumber>
<CardIDResult>M</CardIDResult>
<AVSResult>X</AVSResult>
<CardAuthNumber>123456</CardAuthNumber>
<CardRefNumber>0abcdef</CardRefNumber>
<CardType>VISA</CardType>
<IPResult>NNN</IPResult>
</Result>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Legal, ta la. Nunca tinha trabalhado com xml pra manipular o resultado antes...

 

O que busco pra comparar e esta linha: <Approved>APPROVED</Approved>

 

 

Legal, agora tenta com esse cara aqui:

 

/**
 * Interpreta o retorno da administradora do cartão e verifica se a transação foi aprovada
 * @param string $xml O retorno da administradora
 * @return boolean TRUE se a transação for aprovada
 */
function isApproved( $xml ){
    $ret    = false;
    $dom    = new DOMDocument();

    $dom->loadXML( $xml );
    $xpath    = new DOMXpath( $dom );
    $apprv    = $xpath->query( "//Result/Approved/text()" );

    if ( $apprv ){
        $ret = (bool) preg_match( "/^APPROVED$/i" , $apprv->item( 0 )->nodeValue );
    }

    return( $ret );
}

Esse kara ai em cima faz o trabalho para você, ai para verificar se foi aprovado você faz:

 

if ( isApproved( $result ) ){
     echo "Legal, foi aprovado !!!";
 } else {
     echo "Opz..."
 }

Onde $result é a string XML que você recebeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta dando este erro: Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /home/bids4job/wwwroot/bids4jobs.com/bids4jobs-psigate/psigate/gateway/xml.php on line 53

 

na linha 53 tem isso: $ret = (bool) preg_match( "/^APPROVED$/i" , $apprv->item( 0 )->nodeValue );

 

 

eu to testando o codigo que me passou logo apos isso: xml_parser_free($xml_parser); esta certo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ta dando este erro: Parse error: syntax error, unexpected T_OBJECT_OPERATOR in /home/bids4job/wwwroot/bids4jobs.com/bids4jobs-psigate/psigate/gateway/xml.php on line 53

 

na linha 53 tem isso: $ret = (bool) preg_match( "/^APPROVED$/i" , $apprv->item( 0 )->nodeValue );

 

 

eu to testando o codigo que me passou logo apos isso: xml_parser_free($xml_parser); esta certo?

 

Você não vai mais precisar do xml_parser, mas tenta colocar um ponto-e-virgula lá em baixo que eu esqueci:

 

 if ( isApproved( $result ) ){
     echo "Legal, foi aprovado !!!";
 } else {
     echo "Opz...";
 }

Se isso não funcionar tenta retirar o cast da frente do preg_match:

 

 $ret = preg_match( "/^APPROVED$/i" , $apprv->item( 0 )->nodeValue );

Compartilhar este post


Link para o post
Compartilhar em outros sites

continua com o erro T_OBJECT_OPERATOR

 

tem algum lugar pra eu pesquisar pra te ajudar?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

continua com o erro T_OBJECT_OPERATOR

 

tem algum lugar pra eu pesquisar pra te ajudar?

 

Amigão, isso está me cheirando PHP antigo, hehehe

Tenta usar essa versão da função:

 

  /**
   * Interpreta o retorno da administradora do cartão e verifica se a transação foi aprovada
   * @param string $xml O retorno da administradora
   * @return boolean TRUE se a transação for aprovada
   */
  function isApproved( $xml ){
      $ret    = false;
      $nodes    = simplexml_load_string( $xml );
  
      if ( isset( $nodes->Approved ) ){
          $ret = preg_match( "/^APPROVED$/i" , $nodes->Approved );
      }
  
      return( $ret );
  }

O uso é exatamente igual:

 

  if ( isApproved( $result ) ){
      echo "Legal, foi aprovado !!!";
  } else {
      echo "Opz...";
  }

Compartilhar este post


Link para o post
Compartilhar em outros sites

deu outro erro agora: Call to undefined function: simplexml_load_string() ....on line 43

 

line 43 > $nodes = simplexml_load_string( $xml );

 

so uma coisa: isso ai que voce fez esta nesta secao? http://us2.php.net/manual/en/book.xml.php

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

seguinte amigão.....vou ter que ir embora agora porque o pessoal vai encerrar o expediente daqui a pouco, porem vou pesquisar sobre isso que me enviou pra ver se consigo entender pra te ajudar tambem ok, se puder me mandar algo sobre o que devo ler pra entender isso ai que voce ta fazendo seria interesante pois preciso entender isso tambem.

Até o momento muitiiiiiiiiiiiiisiiiiiimo obrigado. Vamos nos falando ok?

 

Obrigadão.

Ricardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

deu outro erro agora: Call to undefined function: simplexml_load_string() ....on line 43

 

Amigão, isso definitivamente é coisa de PHP antigo, hehehehe

 

Versão 3:

 /**
  * Interpreta o retorno da administradora do cartão e verifica se a transação foi aprovada
  * @param string $xml O retorno da administradora
  * @return boolean TRUE se a transação for aprovada
  */
 function isApproved( $xml ){
     $ret = false;
     $dom = new DOMDocument();
     $dom->loadXML( $xml );
 
     if ( ( $approved = $dom->getElementsByTagName( "Approved" ) ) ){
         $node = $approved->item( 0 );
         $value = $node->nodeValue;
 
         if ( preg_match( "/^APPROVED$/i" , $value ) ){
             $ret = true;
         }
     }
 
     return( $ret );
 }

O uso continua exatamente igual:

 if ( isApproved( $result ) ){
     echo "Legal, foi aprovado !!!";
 } else {
     echo "Opz...";
 }

so uma coisa: isso ai que voce fez esta nesta secao? http://us2.php.net/m...en/book.xml.php

 

DOM => http://us2.php.net/m...en/book.dom.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

valeu, vou ver se consigo entender um pouco isso ai. valeu mesmo !

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.