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

?View Code JAVASCRIPT
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 &lt; 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

echo “Bem Vindos”;

Olá, criei esse blog para compartilhar minha experiências na área de tecnologia com aqueles que como eu saem “googleando” por ai na expectativa de sanar seus problemas.

Hoje estou com o tempo escasso mas em breve farei um post sobre minha experiência com XML, PHP e AJAX.

Abraços.