How to search for an element in XML using Javascript

Asked

Viewed 2,272 times

3

I want to search for a certain element (in case name) in a document XML, using only one input text-type.

Code of what I’ve already got

TagXML = function() {

  dados = "<doc>"
  dados = dados + "<clientes>"
  dados = dados + "<nome>Maria Adriana</nome>"
  dados = dados + "<telefone>(11) 5555-1234</telefone>"
  dados = dados + "<idade>2</idade>"
  dados = dados + "</clientes>"
  dados = dados + "<clientes>"
  dados = dados + "<nome>Giovana Pereira</nome>"
  dados = dados + "<telefone>(11) 5555-6789</telefone>"
  dados = dados + "<idade>25</idade>"
  dados = dados + "</clientes>"
  dados = dados + "<clientes>"
  dados = dados + "<nome>Ricardo Ramos</nome>"
  dados = dados + "<telefone>(11) 5555-6090</telefone>"
  dados = dados + "<idade>26</idade>"
  dados = dados + "</clientes>"
  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 var registro o conteudo de uma tag "doc"
  registro = xmlDoc.getElementsByTagName("doc")[0];

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

  // Laço dentro da tag "nome" para cada tag "nome" que encontrar
  for (var i in nome) {
    // Verificando se houve alguma busca com sucesso
    if (nome[i].firstChild.textContent == busca) {
      // Exibindo os resultados encontrados
      alert('existe sim');
      break;
    } else {
      alert('não existe');
      break;
    }
  }
}
<input type="text" value="" id="campo" />
<input type="button" value="Procurar" onclick="TagXML();" />

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


The idea is to issue a alert() whether the result exists or not.

For that I need to read the XML and make the selection according to the index [i] going through each element of the tag "name".

What’s going on

inserir a descrição da imagem aqui

Problem - The three names exist within the XML, but he only confirms the first, and annuls the rest.

The loop that should return the index position number of each "name", only returns the first index.

1 answer

4


Your problem is in break.... change to continue and be happy

Code explained (with example) how break and continue in javascript here

TagXML = function() {

  dados = "<doc>"
  dados = dados + "<clientes>"
  dados = dados + "<nome>Maria Adriana</nome>"
  dados = dados + "<telefone>(11) 5555-1234</telefone>"
  dados = dados + "<idade>2</idade>"
  dados = dados + "</clientes>"
  dados = dados + "<clientes>"
  dados = dados + "<nome>Giovana Pereira</nome>"
  dados = dados + "<telefone>(11) 5555-6789</telefone>"
  dados = dados + "<idade>25</idade>"
  dados = dados + "</clientes>"
  dados = dados + "<clientes>"
  dados = dados + "<nome>Ricardo Ramos</nome>"
  dados = dados + "<telefone>(11) 5555-6090</telefone>"
  dados = dados + "<idade>26</idade>"
  dados = dados + "</clientes>"
  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 var registro o conteudo de uma tag "doc"
  registro = xmlDoc.getElementsByTagName("doc")[0];

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

  // Laço dentro da tag "nome" para cada tag "nome" que encontrar
  for (i = 0; i < nome.length; i++) {
    // Verificando se houve alguma busca com sucesso
    if (nome[i].firstChild.textContent == busca) {
      // Exibindo os resultados encontrados
      alert('existe sim');
      break;
    } else {
      alert('nao existe na posicao' + i);
      continue;
    }
  }
  
}
<input type="text" value="" id="campo" />
<input type="button" value="Procurar" onclick="TagXML();" />

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


[Obs] I’d do it differently:

TagXML = function() {

  dados = "<doc>"
  dados = dados + "<clientes>"
  dados = dados + "<nome>Maria Adriana</nome>"
  dados = dados + "<telefone>(11) 5555-1234</telefone>"
  dados = dados + "<idade>2</idade>"
  dados = dados + "</clientes>"
  dados = dados + "<clientes>"
  dados = dados + "<nome>Giovana Pereira</nome>"
  dados = dados + "<telefone>(11) 5555-6789</telefone>"
  dados = dados + "<idade>25</idade>"
  dados = dados + "</clientes>"
  dados = dados + "<clientes>"
  dados = dados + "<nome>Ricardo Ramos</nome>"
  dados = dados + "<telefone>(11) 5555-6090</telefone>"
  dados = dados + "<idade>26</idade>"
  dados = dados + "</clientes>"
  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 var registro o conteudo de uma tag "doc"
  registro = xmlDoc.getElementsByTagName("doc")[0];

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

  // Laço dentro da tag "nome" para cada tag "nome" que encontrar
  for (i = 0; i < nome.length; i++) {
    // Verificando se houve alguma busca com sucesso
    if (nome[i].firstChild.textContent == busca) {
      // Exibindo os resultados encontrados
      var existe = 1;
      var linha = i;
      break;
    }
  }
  
  if(existe){ alert("existe sim!! na linha: "+ linha) }else{ alert("nao existe") }
}
<input type="text" value="" id="campo" />
<input type="button" value="Procurar" onclick="TagXML();" />

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

  • 1

    The continue is optional until. But that’s it :) Diego: take advantage and declare this lot of variable without var that you have there, because this is all leaking to the global scope and can cause you problems.

  • 1

    Another tip, the Snippets here in the network has a great identation tool (almost every good professional editor[and most of the free inclusive] have), their codes are usually very poorly devised, this hurts when someone tries to find a solution.... even you can end up getting confused yourself

Browser other questions tagged

You are not signed in. Login or sign up in order to post.