Jump to content

Question

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>

 

Edited by João Batista Neto
Adicionar marcação de código

Share this post


Link to post
Share on other sites

5 answers to this question

Recommended Posts

  • 0
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.

Share this post


Link to post
Share on other sites
  • 0

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.

 

 

:smile:

 

Share this post


Link to post
Share on other sites
  • 0

Estou tentando seguir o passo a passo descrito pelo @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 />";
               }

              }

          }

 

Share this post


Link to post
Share on other sites
  • 0

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
    // ...
}

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By jgasper
      Olá, estou desenvolvendo um sistema de requisições para almoxarifado. Na tela de requisição o usuário terá a opção de incluir o item + quantidade que deseja, e haverá um botão + para poder adicionar mais itens. Porém não consigo pensar em como fazer isso ir para o banco e como salvar isso no pedido. Alguém tem algum exemplo ou pode me ajudar nesse caso?
    • By violin101
      Caros amigos
       
      saudações...
       
      Primeiramente peço desculpa se postei minha dúvida na opção errada.
       
      Estou escrevendo uma Rotina para Impressão de Relatório usando mPDF, até aqui tudo bem.
       
      O relatório tem um: Título - Tabela - Dados.
       
      Minha dúvida:
      --[ como faço para REPETIR em todo SALTO de Página o Título ou Cabeçalho da Tabela, por exemplo:
       
      Título.................: Relatório de Estoque
      Tabela Campos: Código | Descrição | ESP | Qtde | Valor
       
      Grato,
       
      Cesar 
       
    • By Sapinn
      Opa galera tudo beleza? Então meu banco está me retomando um erro quando tento inserir nele que é "Dados truncados na coluna valor_produto" essa coluna era do tipo Double quando eu mudei para ela para TEXT funcionou os dados foram inseridos mas eu preciso que ela seja do tipo double. Alguém sabe como resolver????
    • By k9studio
      Olá Amigos,
      se alguem puder dar um help fico muito grato
      seguinte:
      estou criando um sistema de login com cookie
      todas as paginas fica no patch
      www/htdocs/script/
      quando logar no dominio.com.br liberar o acesso no  cliente.dominio.com.br tambem
      acesso:dominio.com.br
      ou
      quando logar no cliente.dominio.com.br liberar o acesso no dominio.com.br tambem
      acesso:cliente.dominio.com.br
      e guando deslogar quebrar conxao com os dois
      existe uma maneira de fazer isso?
       
    • By Kefatif
      Prezados boa tarde.
       
      Preciso bloquear a edição de um date input de forma que só seja possível selecionar a data através do calendário.
       
      Alguém pode me ajudar?
       
      Utilizo php, html e js.
       
      <input type="date" value="<?php echo $data ?>" name="datacoleta" class="form-control" required style="width:100%;">  
      Agradeço desde já.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.