Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde, Pessoal.
Estou com uma dificuldade tremenda para entender as informações que recebo no retorno de um serviço.
Estou verificando que estou recebendo um xml dentro do outro... isso é correto?
Exemplo:
<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:Body>
<POSFINRESPONSE xmlns="http://187.94.62.86:6621/">
<POSFINRESULT><![CDATA[<?xml version="1.0" encoding="ISO-8859-1"?><posfin><TITULO><E1_NUM>000058711</E1_NUM><E1_EMISSAO>20160901</E1_EMISSAO><E1_VENCREA>20170316</E1_VENCREA><E1_VALOR>622.63</E1_VALOR><E1_JUROS>0</E1_JUROS><E1_MULTA>0</E1_MULTA><E1_NOMCLI>AGF JABOATAO CENTRO</E1_NOMCLI><A1_CGC>41024050000196</A1_CGC><E1_BAIXA></E1_BAIXA><RECNO>230968</RECNO></TITULO><TITULO><E1_NUM>000058712</E1_NUM><E1_EMISSAO>20160901</E1_EMISSAO><E1_VENCREA>20170417</E1_VENCREA><E1_VALOR>622.63</E1_VALOR><E1_JUROS>0</E1_JUROS><E1_MULTA>0</E1_MULTA><E1_NOMCLI>AGF JABOATAO CENTRO</E1_NOMCLI><A1_CGC>41024050000196</A1_CGC><E1_BAIXA></E1_BAIXA><RECNO>230969</RECNO></TITULO><TITULO><E1_NUM>000058713</E1_NUM><E1_EMISSAO>20160901</E1_EMISSAO><E1_VENCREA>20170516</E1_VENCREA><E1_VALOR>622.63</E1_VALOR><E1_JUROS>0</E1_JUROS><E1_MULTA>0</E1_MULTA><E1_NOMCLI>AGF JABOATAO CENTRO</E1_NOMCLI><A1_CGC>41024050000196</A1_CGC><E1_BAIXA></E1_BAIXA><RECNO>230970</RECNO></TITULO><TITULO><E1_NUM>000058714</E1_NUM><E1_EMISSAO>20160901</E1_EMISSAO><E1_VENCREA>20170616</E1_VENCREA><E1_VALOR>622.63</E1_VALOR><E1_JUROS>0</E1_JUROS><E1_MULTA>0</E1_MULTA><E1_NOMCLI>AGF JABOATAO CENTRO</E1_NOMCLI><A1_CGC>41024050000196</A1_CGC><E1_BAIXA></E1_BAIXA><RECNO>230971</RECNO></TITULO><TITULO><E1_NUM>000058715</E1_NUM><E1_EMISSAO>20160901</E1_EMISSAO><E1_VENCREA>20170717</E1_VENCREA><E1_VALOR>622.63</E1_VALOR><E1_JUROS>0</E1_JUROS><E1_MULTA>0</E1_MULTA><E1_NOMCLI>AGF JABOATAO CENTRO</E1_NOMCLI><A1_CGC>41024050000196</A1_CGC><E1_BAIXA></E1_BAIXA><RECNO>230972</RECNO></TITULO><TITULO><E1_NUM>000058716</E1_NUM><E1_EMISSAO>20160901</E1_EMISSAO><E1_VENCREA>20170816</E1_VENCREA><E1_VALOR>622.63</E1_VALOR><E1_JUROS>0</E1_JUROS><E1_MULTA>0</E1_MULTA><E1_NOMCLI>AGF JABOATAO CENTRO</E1_NOMCLI><A1_CGC>41024050000196</A1_CGC><E1_BAIXA></E1_BAIXA><RECNO>230973</RECNO></TITULO><TITULO><E1_NUM>000058717</E1_NUM><E1_EMISSAO>20160901</E1_EMISSAO><E1_VENCREA>20170918</E1_VENCREA><E1_VALOR>622.63</E1_VALOR><E1_JUROS>0</E1_JUROS><E1_MULTA>0</E1_MULTA><E1_NOMCLI>AGF JABOATAO CENTRO</E1_NOMCLI><A1_CGC>41024050000196</A1_CGC><E1_BAIXA></E1_BAIXA><RECNO>230974</RECNO></TITULO></posfin>]]></POSFINRESULT>
</POSFINRESPONSE>
</soap:Body>
</soap:Envelope>Grato, pela resposta.
-
Nesse caso como devo fazer para captura esse dados?
Nesse caso, a sugestão é que você leia-o com DOM. Faça a chamada ao serviço SOAP normalmente; quando a resposta chegar, pegue o XML do POSFINRESULT e leia-o com DOM.
DOM.getElementsByTagName para obter um DOMNodeList com todos os nós TITULO. Aí você itera esse DOMNodeList para obter cada um dos Node TITULO; com o Node TITULO, você pega seus Node.childNodes e você terá cada um dos Nodes filhos de Título e poderá pegar seus valores.
-
DOMNode
-
Estou tentando seguir o passo a passo descrito pelo /profile/94216-jo%C3%A3o-batista-neto/?do=hovercard" data-mentionid="94216" href="/profile/94216-jo%C3%A3o-batista-neto/" rel="">@João Batista Neto ... e deparei com o seguinte erro ao tentar exibir as informações contida no XML:
Trying to get property of non-object
Segue código abaixo: Onde estou errando que não consigo capturar os valores contido no XML?
ini_set ( 'soap.wsdl_cache_enable' , 0 ); ini_set ( 'soap.wsdl_cache_ttl' , 0 );
$client=new SoapClient('http://187.94.62.86:6621/ws/WS_TITULOS.apw?WSDL');
if ($client === Null) {
throw new CHttpException(404, 'The requested page does not exist');
return $client;
}
$object = array('CTOKEN' => 'intttpodwsfr0t73!', 'CCLIENTE' => 00111111111111, 'CTP' => 'B', 'CDATADE' => 20170101, 'CDATAATE' => 20171231);
$result = $client->__soapCall("POSFIN", array('POSFINRESULT' => $object));
/* 2 */
/* 3*/
$doc = new DOMDocument; #ok
#Pegar o XML do POSFINRESULT e leia com DOM.
$doc->loadXML($result->POSFINRESULT); #ok
#Através do getElementsByTagName obter um DOMNResul
# $nodelist = $dom->getElementsByTagName('<TITULO> </TITULO>'); #ok
$nodeList = $doc->getElementsByTagName('<TITULO></TITULO>')->item(0);
foreach ($nodeList->childNodes as $node) {
if ($node->hasChildNodes()) {
$childs = $node->childNodes;
foreach($childs as $i) {
echo $i->nodeValue . "<br />";
}
}
}Tá errado; chegou a ler o link com a documentação que te passei?
$domNodeList = $dom->getElementsByTagName('TITULO'); //você tem que pegar o nome da tag
for ($i = 0, $t = $domNodeList->length; $i < $t; ++$i) {
$titulo = $domNodeList->item($i); //aqui você tem um título individual
$num = $titulo->getElementsByTagName('E1_NUM')->item(0); //aqui você tem o E1_NUM do título atual
$emissao = $titulo->getElementsByTagName('E1_EMISSAO')->item(0); //aqui você tem o E1_EMISSAO do título atual
// ...
}
>
10 minutos atrás, cleytonSouza disse:
Estou verificando que estou recebendo um xml dentro do outro... isso é correto?
Se o "isso é correto" for quanto a estar recebendo um XML, então sim, POSFINRESULT é um bloco CDATA com um XML; isso é um fato.
Agora, se o "isso é correto" for quanto ao serviço te enviar um XML, aí a conversa é outra. SOAP significa Simple Object Access Protocol, com bastante ênfase ao Object. Quando o serviço te cospe um XML dessa forma, sei lá, mas me parece que não compreendem o protocolo, precisavam fornecer acesso externo e SOAP foi a forma com menor trabalho - a.k.a. nas coxas - que a ferramenta que usam oferecia.
É correto? Não gosto; mas é possível.