Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

cyber_jso

Validação de XML

Recommended Posts

Olá pessoal!Tenho um arquivo arq1.php que consulta um banco de dados e retorna um xml para um outro arquivo arq2.php. O arquivo que solicita as informações (arq2.php) o faz via AJAX utilizando prototype. O xml de retorno (retornado pelo arq1.php) reposnde mais ou menos da seguinte forma:<?xml version="1.0" encoding="UTF-8" standalone="no"?><layout><tag1>teste</tag1><tag2>teste2</tag2><tag3></tag3></layout>Leio as informações retornadas através de uma função via js. A função que descrevo abaixo está trabalhando já com o retorno de arq1.php.function js_retorno_teste(req){ result = req.responseXML; $("teste1").value = result.getElementsByTagName("tag1")[0].firstChild.data; $("teste2").value = result.getElementsByTagName("tag2")[0].firstChild.data; $("teste3").value = result.getElementsByTagName("tag3")[0].firstChild.data;}O problema que estou tendo é que quando o banco me retorna uma informação nula (no caso acima gera uma tag com valor nulo que é "tag3") o código não segue adiante, como se a tag não existisse.Fiz algumas tentativas de validação de retorno, porém sem sucesso.Alguém sabe como posso validar o conteúdo de uma tag nula sem provocar erro de script?Desde já agradeço a atenção de todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera... dei uma pesquisada em uma dúvida minha e encontrei esse post que é exatamente o meu problema... mas não foi respondido.Alguém sabe me dizer como resolver quando no XML tem tags com valores null?Obrigado desde ja!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é problema de XML ou de DOM.

 

É um erro de JavaScript.

 

Por exemplo:

Tenho uma variavel 'teste'. Ela é uma variavel simples e não tem propriedades (não é um objeto). Se eu tentar chamar alguma coisa dentro dele que não existe, vou ter um erro de javascript e o script não irá prosseguir.

var teste="2";alert(teste) //dá certoalert(teste.nao_existe) //dá erroalert(teste) //essa linha não será executada pois deu erro acima

Sacou? Como a tag3 não tem filhos e você está tentando acessar o primeiro filho dela, dá erro.

 

 

//Algo muito bom pra ajudar a descobrir este tipo de erros é o firebug.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Micox, hehe, na verdade eu sei a causa (é que o javascript ta chamando algo que não existe)... só não sei como resolver isso... pois a busca que eu faço no BD as vezes retorna algo e as vezes não... então vou ter que colocar um if pra verificar se tem algum valor em cada tag do XML?Tipo...var diretorio_thumb = item.getElementsByTagName("diretorio_thumb")[0].firstChild.nodeValue;var arquivo_thumb = item.getElementsByTagName("arquivo_thumb")[0].firstChild.nodeValue;var referencia = item.getElementsByTagName("referencia")[0].firstChild.nodeValue;var texto = item.getElementsByTagName("texto")[0].firstChild.nodeValue;var categoria = item.getElementsByTagName("categoria")[0].firstChild.nodeValue;var observacao = item.getElementsByTagName("observacao")[0].firstChild.nodeValue;var data = item.getElementsByTagName("data")[0].firstChild.nodeValue;Nem todos os campos são obrigatórios, e por isso alguns tem valores nulo mesmo... o que eu faço?Falou, brigado pelo help!

Compartilhar este post


Link para o post
Compartilhar em outros sites

FAz uma função que testa se deve pegar:1) o data do próprio elemento2) o firstChild (como você tá fazendo) ou3) não pegar nenhum (caso vazio).você pode usar o try catch para isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em primeiro lugar, obrigado Micox, não respondi antes porque dei uma parada nesse script...O arquivo que eu fiz (e funcionou) ficou assim:try{ item.getElementsByTagName("observacao")[0].firstChild.nodeValue; item.getElementsByTagName("arquivo_thumb")[0].firstChild.nodeValue; item.getElementsByTagName("referencia")[0].firstChild.nodeValue; item.getElementsByTagName("texto")[0].firstChild.nodeValue; item.getElementsByTagName("categoria")[0].firstChild.nodeValue; item.getElementsByTagName("observacao")[0].firstChild.nodeValue; item.getElementsByTagName("data")[0].firstChild.nodeValue;}catch(e) { }Alguma correção?Valeu aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguma correção?

hahehea, só TODAS.1) a função que você irá fazer é pra recuperar o texto de dentro do nó e não apenas impedir a EXIBIÇÃO de erros.Tente algo assim:
function pegaValor(no){  if(no.childNodes.length>0{//tem filho	return no.firstChild.nodeValue  }else{	try{	  return no.nodeValue	}catch(e){ return "";}  }}
Daí na hora de chamar será:
var categoria = pegaValor(item.getElementsByTagName("categoria")[0]);
pronto. não testei. Acho que dá. A idéia é essa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alguma correção?

hahehea, só TODAS.

hahahhahaha, sinceridade acima de tudo! Ta certo, hahhahaBeleza Micox... vou alterar aqui depois posto como fiz!

Compartilhar este post


Link para o post
Compartilhar em outros sites

function pegaValor(no){  if(no.childNodes.length>0)//tem filho  {	return no.firstChild.nodeValue  }else{	try{	  return no.nodeValue	}catch(e){ return "";}  }}
var diretorio_thumb = pegaValor (item.getElementsByTagName("diretorio_thumb")[0]);var arquivo_thumb  = pegaValor (item.getElementsByTagName("arquivo_thumb")[0]);var referencia = pegaValor (item.getElementsByTagName("referencia")[0]);var texto = pegaValor (item.getElementsByTagName("texto")[0]);var categoria = pegaValor (item.getElementsByTagName("categoria")[0]);var observacao = pegaValor (item.getElementsByTagName("observacao")[0]);var data = pegaValor (item.getElementsByTagName("data")[0]);

Perfeito, era isso mesmo. Valeu campeão!

Compartilhar este post


Link para o post
Compartilhar em outros sites

É nóis.

 

Jabá moment: Pra aprender um pouco mais sobre xml e javascript, dá uma passada no meu tutorial, tem link até pra exemplo de gráfico :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

podemos postar links de paginas pessoais aki??

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sempre postei links de tutoriais meus e nunca tive problema nenhum.

Tenho até links de tutoriais pendurados.

Pode postar aí sim se tiver a ver com o tópico.

 

té mais. :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.