Exemplo de busca em XML com JavaScript?

Quero saber se é possível ou não fazer uma procurar por determinado “nó” XML, utilizando campo de texto.

#Html

<input type="text" value="" id="campo"/>

<input type="button" value="Procurar" onclick="TagXML();"/>

#Script

TagXML = function() {

// Os navegadores carregam um arquivo xml de formas diferentes
if(window.XMLHttpRequest){ 

// Para o Firefox, Opera, e demais iremos usar o XMLHttpRequest (o mesmo que se usa em ajax)
// codigo para IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();  

} else { 

// O IE usa ActiveX
// codigo para o IE6, IE5
xmlhttp = new ActiveXObject("Msxml2.DOMDocument.3.0"); 

}	

// Carrega e armazena o XML na variavel xml
xmlhttp.open("GET", "dados.xml", false);

xmlhttp.send();

xmlDoc = xmlhttp.responseXML.documentElement;

// Executa uma consulta XML e armazena em busca
var busca = document.getElementById('campo').value;

// Armazena na var registro o conteudo de uma tag "nome"
	var registro = xmlDoc.getElementsByTagName('nome');	

// Laço dentro da tag "nome" para cada tag "nome" que encontrar
	for (var i = 0; i < registro.length; i++){

// Verificando se houve alguma busca com sucesso
    if (registro[i].firstChild.textContent == busca){ 

	// Exibindo os resultados encontrados
	alert('existe sim'); break; 

} else { 

	alert('não existe'); break; 

	}

}

}

#XML

<?xml version = "1.0" encoding="ISO-8859-1" ?>
<doc>
<clientes>
<nome>Maria Adriana</nome>
<telefone>(11) 5555-1234</telefone>
<idade>2</idade>
</clientes>
<clientes>
<nome>Giovana Pereira</nome>
<telefone>(11) 5555-6789</telefone>
<idade>25</idade>
</clientes>
<clientes>
<nome>Ricardo Ramos</nome>
<telefone>(11) 5555-6090</telefone>
<idade>26</idade>
</clientes>
</doc>

w3schools - Demonstração


#ScreenShot

Emitindo o evento alert() indicando resultado existe(sim/não).

Como dito no título do tópico eu preciso verificar se existe um determinado nó no meu XML.

Para isso precisamos ler o XML percorrendo e fazer a seleção de acordo com os parâmetros de cada índice [i] da tag “nome”.

Infelizmente não estou conseguindo exerga a maneira de resolver isso.

Se seu intuito é só se aperfeiçoar, eu sugiro que busque outro tópico.

Manipulaçao XML nao é muito comum na comunidade javascript.
JSON é muito mais usado.

Ouso a dizer que 98% do tráfico que passa pelos XMLHttpRequest da vida, é JSON.

@AbelBueno Então estou tentando por si só e esta quase pronto! não vejo mais o porque de mover o este tópico em especial JSON. Preciso de apenas uma olhadinha peculiar, de quem tem maior conhecimento do assunto podendo assim favorecer o código-fonte da pergunta, visto que ainda ha falhas no quesito de busca. Em resumo quero dizer - basta melhorar erros sintaxe que ha sobre o script da pergunta apenas isso, pois esta quase no jeito a rodar redondinho do que pretendo fazer :wink:

Justo, mas qual exatamente é o problema?

Seria esse trecho?

Pois se o campo (assumindo aqui que campo seja “busca”), estiver nulo realmente nao teria como encontrar algo.

O que exatamente nao está certo? Qual a mensagem de erro que apresenta? Dá um exemplo concreto pra facilitar.

Bom editei novamente a Pergunta afim de deixar clara e objetiva, para que não haja duplo sentido e qualquer sombra de dúvidas.

Adicionei um exemplo em w3schools de minha autoria, idealizado com XML incluso no Script. Assim poderá realizar teste direto. :slight_smile:

Segue a solução por agregar break; e continue; juntamente com um evento para validar se o campo esta ou não vazio. Veja:

<!DOCTYPE html>

<html>

<head>

<title>Como buscar um nó XML com JavaScript</title>

</head>

<body>

<input type="text" value="" id="campo"/><input type="button" value="Procurar" onclick="TagXML();"/>

<pre>Ex.: Maria Adriana, Giovana Pereira ou Ricardo Ramos</pre>

</body>

<script>  

TagXML = function() {

var dados="<doc>"

var dados=dados+"<clientes>"

var dados=dados+"<nome>Maria Adriana</nome>"

var dados=dados+"<telefone>(11) 5555-1234</telefone>"

var dados=dados+"<idade>2</idade>"

var dados=dados+"</clientes>"

var dados=dados+"<clientes>"

var dados=dados+"<nome>Giovana Pereira</nome>"

var dados=dados+"<telefone>(11) 5555-6789</telefone>"

var dados=dados+"<idade>25</idade>"

var dados=dados+"</clientes>"

var dados=dados+"<clientes>"

var dados=dados+"<nome>Ricardo Ramos</nome>"

var dados=dados+"<telefone>(11) 5555-6090</telefone>"

var dados=dados+"<idade>26</idade>"

var dados=dados+"</clientes>"

var dados=dados+"</doc>"

// Executa uma consulta XML e armazena em busca
var busca = document.getElementById('campo').value;

if (window.DOMParser) {  

// Demais Navegadores
parser=new DOMParser();  

xmlDoc=parser.parseFromString(dados,"text/xml")  

} else {  

// Internet Explorer
xmlDoc=new ActiveXObject("Microsoft.XMLDOM")  

xmlDoc.async=false;  

xmlDoc.loadXML(dados);  

}  

// Armazena na variável registro o conteudo de uma tag "doc"
var registro = xmlDoc.getElementsByTagName("doc")[0];  

// Guarda na variável nome o conteúdo da tag xml "nome"
var nome = registro.getElementsByTagName("nome");

// O laço for..in interage com o nome das propriedades da XML e retornar o número da posição do índice de cada tag "nome" que encontrar 
for (var i in nome) {

// Verifica se o elemento existe e se houve alguma busca com sucesso, exibi o resultado encontrado
if (nome[i].firstChild.textContent == busca) { 

// Exibindo os resultados encontrados
alert('existe sim'); 

// maneira de parar o laço for..in se eu encontrar o elemento desejado
break; 
        
} else if (busca.length < 1) { // Quando a busca é feita se o campo estiver nulo ele não retorna seu respectivo nó XML

alert("Por favor, Digite o nome!");

return(false);
    
} else if (nome[i].firstChild.textContent != "undefined") {

 // código de retorno se nome for indiferente
continue;

}

}

}

</script>     

Veja demonstração em funcionamento


Não havendo mais nada a declarar, encerra-se a questão como resolvido.

Bom pessoal, é só adaptar conforme a necessidade de cada qual, para isto é necessario prévio conhecimento de sintaxe XML e DOM para implementar com maior precisão, podendo chamar o arquivo XML externo ao invés de utilizar este incluso, posto para exemplificar a real situação da pergunta.