Ir para conteúdo

POWERED BY:

Arquivado

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

JGD

Tratar Xml retornado de WebService / SOAP

Recommended Posts

Olá Pessoal,

 

Como tratar dados de retonro de um webservice

 

Estou recebendo um array de objeto. Imagino eu.

 

Como faço para pegar os elementos do xml retornado?

 

Código do retorno:

 

$result = ($soap->__soapCall($svce, array($parm)));

Já tentei:

 

echo $result->TranspVip_Valor_Frete->Retorno."<br>"; 

Ou assim:

if (is_array($result)){
	while(list($key,$val)= each($result)){
	echo "z ".$key." ".$val."<br>";
	}
}

Não escreve nada.

 

Se der:

 

echo "". print_r($result)."";

Dá este resultado no navegador:

 

stdClass Object ( [valorarReturn] => 1.0 158,82 Valor do Frete ) 1

 

Vendo pelo código fonte do navegador:

 

1 <br>stdClass Object
(
   [valorarReturn] => <?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="http://www.transpVip.com.br/TranspWebService/services"> 
  <TranspVip_Valor_Frete> 
      <versao>1.0</versao> 
      <Retorno>158,82</Retorno> 
      <Mensagem>Valor do Frete</Mensagem> 
  </TranspVip_Valor_Frete> 
</string>
)
1

 

Como tratar este xml ??

 

Agradeço qualquer ajuda.

 

 

JGD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você pode ter visto aqui:

 

stdClass Object ( [valorarReturn] => 1.0 158,82 Valor do Frete ) 1

 

A variável $result não é uma array e sim um objeto.

Tente acessar o valor do retorno assim: $return->valorarReturn.

 

Dá um var_dump() e mostra aí pra a gente o que resulta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como você pode ter visto aqui:

 

stdClass Object ( [valorarReturn] => 1.0 158,82 Valor do Frete ) 1

 

A variável $result não é uma array e sim um objeto.

Tente acessar o valor do retorno assim: $return->valorarReturn.

 

Dá um var_dump() e mostra aí pra a gente o que resulta.

 

 

 

Feelsen,

 

Obrigado por comentar.

 

Veja os resultados:

 

echo "z ".$return->valorarReturn->TranspVip_Valor_Frete->Retorno."<br>";

 

Deu:

 

Z

 

var_dump($result);

Deu:

 

object(stdClass)#15 (1) { ["valorarReturn"]=> string(277) " 1.0 431,82 Valor do Frete " }

 

Também já tentei usar o @file_get_contents, e assim tratar via CURL... Sem sucesso.

 

 

Se acesso diretamente a url no navegador... recebo:

 

<?xml version="1.0" encoding="UTF-8" ?>

- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

- <soapenv:Body>

- <valorarResponse xmlns="">

<ns1:valorarReturn xmlns:ns1="http://TranspVipEdiws"><?xml version="1.0" encoding="utf-8" ?> <string xmlns="http://www.TranspVip.com.br/TranspVipWebService/services"> <TranspVip_Valor_Frete> <versao>1.0</versao> <Retorno>32,58</Retorno> <Mensagem>Valor do Frete</Mensagem> </TranspVip_Valor_Frete> </string></ns1:valorarReturn>

</valorarResponse>

</soapenv:Body>

</soapenv:Envelope>

 

Vejam que parace um xml dentro de outro xml (indo direto pela url)

Como conseguir apenas o xml em vermelho. Sendo que é objeto.

 

 

 

Agradeco qualquer ajuda.

 

JGD

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara ... esse XML seu aí tá errado, não existe XML dentro de XML

Para todos os efeitos ... você pode utilizar uma expressão regular ..

 

<?php
$xml = <<<xml
<?xml version="1.0" encoding="UTF-8" ?> 
- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
- <valorarResponse xmlns="">
<ns1:valorarReturn xmlns:ns1="http://TranspVipEdiws">
<?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="http://www.TranspVip.com.br/TranspVipWebService/services"> 
<TranspVip_Valor_Frete> <versao>1.0</versao> <Retorno>32,58</Retorno> 
<Mensagem>Valor do Frete</Mensagem> </TranspVip_Valor_Frete> </string></ns1:valorarReturn> 
</valorarResponse>
</soapenv:Body>
</soapenv:Envelope>
xml;

       preg_match_all ( '!(<versao>([\d.]+)<\/versao>|<Retorno>([\d,]+)<\/Retorno>|<Mensagem>(.+)<\/Mensagem>)!' , $xml , $matches ) ;
       $valores = array_shift ( $matches ) ;

       $versao = strip_tags ( $valores [ 0 ] ) ;
       $retorno = strip_tags ( $valores [ 1 ] ) ;
       $mensagem = strip_tags ( $valores [ 2 ] ) ; 

       print_r ( $valores ) ;

       echo 'Versão: ' . $versao , PHP_EOL ;
       echo 'Retorno: ' . $retorno , PHP_EOL ;
       echo 'Mensagem: ' . $mensagem , PHP_EOL ;

 

:seta: https://ideone.com/n3eMp

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara ... esse XML seu aí tá errado, não existe XML dentro de XML

Para todos os efeitos ... você pode utilizar uma expressão regular ..

 

<?php
$xml = <<<xml
<?xml version="1.0" encoding="UTF-8" ?> 
- <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
- <soapenv:Body>
- <valorarResponse xmlns="">
<ns1:valorarReturn xmlns:ns1="http://TranspVipEdiws">
<?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="http://www.TranspVip.com.br/TranspVipWebService/services"> 
<TranspVip_Valor_Frete> <versao>1.0</versao> <Retorno>32,58</Retorno> 
<Mensagem>Valor do Frete</Mensagem> </TranspVip_Valor_Frete> </string></ns1:valorarReturn> 
</valorarResponse>
</soapenv:Body>
</soapenv:Envelope>
xml;

       preg_match_all ( '!(<versao>([\d.]+)<\/versao>|<Retorno>([\d,]+)<\/Retorno>|<Mensagem>(.+)<\/Mensagem>)!' , $xml , $matches ) ;
       $valores = array_shift ( $matches ) ;

       $versao = strip_tags ( $valores [ 0 ] ) ;
       $retorno = strip_tags ( $valores [ 1 ] ) ;
       $mensagem = strip_tags ( $valores [ 2 ] ) ; 

       print_r ( $valores ) ;

       echo 'Versão: ' . $versao , PHP_EOL ;
       echo 'Retorno: ' . $retorno , PHP_EOL ;
       echo 'Mensagem: ' . $mensagem , PHP_EOL ;

 

:seta: https://ideone.com/n3eMp

 

 

Andrey,

 

Obrigado pela dica.

 

Só não consegui testa-la. Por favor me oriente:

1) Pego o $result que é objeto e transformo em string?? É isso?

Caso afirmativo. Como fazer isso. Já que é um array de objeto.

 

2) Também não sou bom com expressões regulares... A varíaval "$xml = <<<xml..." (sua) Seria tudo que deve ser retirar da string? E as quebras de linhas? A transformação do objeto pra string tira isso também?

 

 

Desculpa se estou falando algo (ou muita coisa) errado.

 

Procurando alterantivas encontrei esta:

 

function objectToArray($object)

{

if(!is_object($object) && !is_array($object))

return $object;

 

$array=array();

foreach($object as $member=>$data)

{

$array[$member]=objectToArray($data);

}

return $array;

}

fonte: http://blog.cnizz.com/2008/04/08/convert-php-object-to-an-array/

 

 

Porem também não rolou... Ou eu não estou sabendo utilizar.

 

Agradeço qualquer ajuda.

 

JGD

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.