Recuperar dados nulos de XML com AJAX
A algum tempo tive um problema ao tentar recuperar valores nulos de um XML utilizando AJAX, os dados vinham do BD e o campo dígito da agência poderia vir nulo, pois nem todas as agências possuem dígito.
Quando recebia um valor nulo o nó não era fechado da forma tradicional <dados></dados> e sim desta forma <dados />, isso gera um problema ao usar o HttpRequest, porque ele fica esperando a tag de fechamento e gera um erro. Então resolvi utilizar o atributo value no nó problemático da seguinte forma <dados value=” /> e problema resolvido.
Vou exemplificar para que fique mais fácil entender:
Código do ajax.js que vai chamar o consulta.php receber os dados e injetar no formulário
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | //ajax.js // SIMPLIFICA O USO DE document.getElementByID(campo) function e(elemento) { return document.getElementById(elemento); } function recuperaXML() { http_request = new XMLHttpRequest();//cria o objeto do tipo Http Request http_request.onreadystatechange = function() { /*PROPRIEDADES DO readyState 0 = não incializado 1 = carregando 2 = carregado 3 = resultados parciais 4 = processo completo mais informações (http://www.devguru.com/technologies/xmldom/quickref/httpRequest_readyState.html) */ if(http_request.readyState < 4)//Enquanto não completa exibe imagem de loading { e('mensagem').innerHTML = '<img src="loading.gif" alt="" width="235" height="235" />'; } else if(http_request.readyState == 4)//PROCESSO PRONTO { //http://www.w3.org/Protocols/HTTP/HTRESP.html if(http_request.status == 200)//PAGINA CHAMADA RETORNA OK { e('mensagem').innerHTML = "Obrigado por aguardar, processo concluído com sucesso"; retorno = http_request.responseXML; //recupera o que a pagina chamada retornou cliente = retorno.getElementsByTagName('dados');//cria um array com os dados do cliente pegando elementos do nó 'dados' nome = cliente[0].getElementsByTagName('nome');//criando um objeto 'nome' pegando pela tag nome no xml; valorDebito = cliente[0].getElementsByTagName('valorDebito').item(0).getAttribute('value');//recupera o valor utilizando o atributo VALUE //seta os valores nos campos e('nome').value = nome[0].firstChild.nodeValue; e('valor').value = valorDebito; } } else { e('mensagem').innerHTML = "Desculpe, mas ocorreu um erro ao recuperar os dados"; } } http_request.open('GET', 'consulta.php'); http_request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); http_request.send(null); } |
1 2 3 4 5 6 7 8 9 10 | <? //consulta.php echo "<cliente>"; echo "<dados>"; echo "<nome>$nome</nome>"; //echo "<valorDebito>$valorDebito</valorDebito>"; //aqui eu estou usando nó para receber um valor nulo echo "<valorDebito value='$valorDebito' />"; //aqui estou sando o atributo 'value' para receber um valor nulo echo "</dados"; echo "</cliente>"; ?> |
1 2 3 4 5 6 7 8 9 10 11 | <script src="ajax.js" type="text/javascript"><!--mce:0--></script> <label>Nome: <input id="nome" name="nome" type="text" /> </label> <label>Valor Débito: <input id="valor" name="Valor" type="text" /> </label> <label> <input id="button" onclick="recuperaXML();" name="button" type="button" value="Consultar" /> </label> |
Estes são os 3 arquivos necessários para o nosso exemplo, reparem que a linha 13 e linha 14 recebem o mesmo valor mas de forma diferente, no primeiro caso, receberemos um erro ao tentar obter o conteúdo, descomentem a linha e façam um teste.
Espero que tenha sido claro, qualquer dúvida é só deixar um comentário.
Abraços