3

Estou fazendo uma requisição no php via curl, e na resposta esta me retornando um xml, porém não consigo trabalhar com esse xml..

REQUISIÇÃO:

<br>
curl = curl_init('http://ws.targetmailing.com.br/consulta');<br>
curl_setopt($curl, CURLOPT_HEADER, false);<br>
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);<br>
curl_setopt($curl, CURLOPT_POST, true);<br>
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);<br>
$response = curl_exec($curl);<br>
curl_close($curl);
<br>

RETORNO:

 <?xml version="1.0" encoding="UTF-8"?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:resultado xmlns:ns2="http://ws.targetmailing.com.br/consulta" restricao="false" data="2016-04-29T07:42:59.456-03:00"><protocolo numero="1541656894" digito="9"/><operador codigo="1000" nome="INFOMAIL SERVICOS DE BANCO DE DADOS E INFORMATICA"/><consumidor><consumidor-pessoa-juridica data-fundacao="1990-01-01T00:00:00-03:00" nome-comercial="RAZÃO SOCIAL HOMOLOGAÇÃO" razao-social="A EMPRESA LTDA ME"><cnpj numero="74907134000142"/><endereco logradouro="R JOSÉ DA SILVA" numero="10" bairro="CENTRO" cep="01342000"><cidade nome="SÃO PAULO"><estado sigla-uf="SP"/></cidade></endereco></consumidor-pessoa-juridica></consumidor><spc><resumo quantidade-total="0"/></spc></ns2:resultado></S:Body></S:Envelope>

COMO ESTOU TRATANDO:

<br>
$result = simplexml_load_string($response);

ERRO:

Warning (2): simplexml_load_string(): Entity: line 1: parser error : Start tag expected, '<' not found [APP/Controller/EcommerceController.php, line 832]<br>
Warning (2): simplexml_load_string() [function.simplexml-load-string]:  &lt;?xml version=&#039;1.0&#039; encoding=&#039;UTF-8&#039;?&gt;&lt;S:Envelope  [APP/Controller/EcommerceController.php, line 832]<br>
Warning (2): simplexml_load_string() [function.simplexml-load-string]:  ^ [APP/Controller/EcommerceController.php, line 832]
2
  • Testei aqui seu XML e funcionou ok. Alguma configuração no seu php esta retirando a tag <? ?> do XML. Dê um echo antes de mandar imprimir e veja se a estrutura do xml está correta. Commented 7/07/2016 às 22:01
  • Maycon teste os dois exemplos separadamente por favor: pt.stackoverflow.com/a/139663/3635 e me diga se ambos funcionaram, caso contrário me diga qual deles falhou.
    – Syzoth
    Commented 8/07/2016 às 19:34

2 Respostas 2

1

O problema é claramente no WebService, fora que o endereço /consulta se aberto diretamente emite uma série de erros, o que me faz pensar que esse WS está com várias falhas, no entanto se ele não é seu não tem como resolver então.

O que acontece é que ele esta gerando entidades no lugar de vários caracteres, como por exemplo &lt; no lugar de <.

Provisoriamente use html_entity_decode pra corrigir:

curl = curl_init('http://ws.targetmailing.com.br/consulta');
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$response = curl_exec($curl);
curl_close($curl);

$response = html_entity_decode($response);

$result = simplexml_load_string($response);

No entanto recomendo que entre em contato com o responsavel pelo WS e verifique se tem que passar alguma header, por exemplo:

curl = curl_init('http://ws.targetmailing.com.br/consulta');
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Accept: application/xml,text/xml;q=0.9,text/plain;q=0.8'
));

$response = curl_exec($curl);

curl_close($curl);

$result = simplexml_load_string($response);
0

Em PHP, nesses casos, é muito comum você usar o @ nessas funções para suprimir os erros. Alguns caso, é muito comum isso acontecer com DomDocument.

Então você pode fazer dessa forma:

$dom = new DomDocument();  

@$dom->loadXml($result_curl);

Ou então

@simplexml_load_string($result_curl)

Nota: No código xml postado na pergunta tem um espaço antes do <?xml ?>, fiz os testes necessário para perceber que isso afetaria o parser de xml do PHP. Se for o seu caso, você também pode fazer assim:

 simplexml_load_string(ltrim($result_curl));

Observe esses dois testes:

https://ideone.com/H7PbMJ

1
  • Ne pergunta eu errei, esta me retornando assim: &lt;?xml version=&#039;1.0&#039; encoding=&#039;UTF-8&#039;?&gt;&lt;S:Envelope xmlns:S=&quot;schemas.xmlsoap.org/soap/envelope/… xmlns:ns4=&quot;w3.org/2003/05/…; cvc-enumeration-valid: Value &#039;&#039; is not facet-valid with respect to enumeration &#039;[F, J]&#039;. It must be a value from the enumeration.&lt;/faultstring&gt;&lt;/S:Fault&gt;&lt;/S:Body&gt;&lt;/S:Envelope&gt; Commented 8/07/2016 às 19:03

Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag .