JGD 0 Denunciar post Postado Novembro 14, 2011 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
Feelsen 0 Denunciar post Postado Novembro 14, 2011 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
JGD 0 Denunciar post Postado Novembro 15, 2011 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
Andrey Knupp Vital 136 Denunciar post Postado Novembro 15, 2011 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
JGD 0 Denunciar post Postado Novembro 16, 2011 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