Foros del Web » Programando para Internet » Javascript »

Leer fichero XML

Estas en el tema de Leer fichero XML en el foro de Javascript en Foros del Web. Hola a todos. Veréis, estoy intentando leer un fichero XML desde HTML con Javascript y me surgen problemas a la hora de cargar el fichero. ...
  #1 (permalink)  
Antiguo 23/05/2012, 08:49
 
Fecha de Ingreso: mayo-2012
Mensajes: 3
Antigüedad: 12 años
Puntos: 0
Pregunta Leer fichero XML

Hola a todos.

Veréis, estoy intentando leer un fichero XML desde HTML con Javascript y me surgen problemas a la hora de cargar el fichero.
Tengo un fichero XML que contiene personas almacenando de estas sus nombres y apellidos. La intención es con una función en Javascript que recibe un nombre y un apellido, recorrer cada una de las personas almacenadas en dicho fichero y que me muestre (en este momento con un simple alert me sirve) si la persona se encuentra ya almacenada o no.

Nunca antes había tocado XML y con Javascript había hecho muy, muy poco, asique si pudieseis echarme una manita me sería de gran ayuda ya que me urge mucho terminar esto.

Os dejo el código XML:
Código:
<?xml version="1.0" encoding="utf-8"?>
<PERSONAS>
     <persona>
         <nombre> Andrea </nombre>
         <apellido> Martinez </apellido>
     </persona>
     <persona>
         <nombre> Juan </nombre>
         <apellido> Fernandez </apellido>
     </persona>
<PERSONAS>
Y la función de Javascript (¡cuidado!, están las 4 distintas opciones que he estado probando de como cargar el fichero XML):

Código:
function ComprobarPersonaAlmacenada(nombre,apellido) { 

    //----------------
    //Opción 1:
    xmlDoc = CreateMSXMLDocumentObject();
    xmlDoc.loadXML("personasAlmacenadas.xml");

    //----------------
    //Opción 2:
    xmlDoc = loadXMLDoc("personasAlmacenadas.xml");

    //----------------
    //Opción 3:
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = false;
    xmlDoc.load("personasAlmacenadas.xml");

    //---------------- 
    //Opción 4: 
    var xmlDoc=null; 

    if (window.ActiveXObject){
        xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
    }else if (document.implementation.createDocument){
        xmlDoc=document.implementation.createDocument(""," ",null); 
    }else { 
        alert('Your browser cannot handle this script'); 
    }

    if (xmlDoc!=null){ 
        xmlDoc.async=false; 
        xmlDoc.load("personasAlmacenadas.xml"); 

    //------------- 
        numUsers = xmlDoc.getElementsByTagName("persona").length;
        for ( i = 0; i < numUser ; i++ ) {
            if (xmlDoc.getElementsByTagName("nombre").childNodes[0] == nombre && xmlDoc.getElementsByTagName("apellido").childNodes[0] == apellido ) {
                alert('La persona está almacenada');
            } 
        } 
        alert('La persona no está almacenada'); 
    }
};
Muchísimas gracias de antemano por toda la ayuda que podais aportarme.
  #2 (permalink)  
Antiguo 23/05/2012, 09:34
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 17 años, 1 mes
Puntos: 47
Respuesta: Leer fichero XML

Prueba poniendolo asi

Código Javascript:
Ver original
  1. numUsers = xmlDoc.getElementsByTagName("persona").length;
  2.         for ( i = 0; i < numUser ; i++ ) {
  3.             if (numUsers[0].childNodes[0].tagName == nombre && numUsers[0].childNodes[1].tagName == apellido ) {
  4.                 alert('La persona está almacenada');
  5.             }
  6.         }

Saludos
  #3 (permalink)  
Antiguo 23/05/2012, 09:53
 
Fecha de Ingreso: mayo-2012
Mensajes: 3
Antigüedad: 12 años
Puntos: 0
Respuesta: Leer fichero XML

Muchas gracias por tu respuesta djaevi, por desgracia, he probado lo que me comentas y sigue sin funcionarme.

He esta mañana he estado probando a poner alerts repartidos por toda la función para averiguar hasta donde llegaba y no llega a cargarme el fichero XML. ¿Alguno podría comentarme de las opciones que tengo puestas en el código sobre como cargar el fichero sería la mejor o estaría correcta? Y si ninguna lo está, ¿podríais darme una manera correcta de hacerlo?

Muchísimas gracias por todo.

Saludos.
  #4 (permalink)  
Antiguo 25/05/2012, 04:00
 
Fecha de Ingreso: mayo-2012
Mensajes: 3
Antigüedad: 12 años
Puntos: 0
Respuesta: Leer fichero XML

Hola a todos de nuevo...

Siento insistir en el tema, pero necesito encontrar una solución que funcione con la mayor rapidez posible, y si por algún casual alguien que pueda ayudarme lo lee... Me solucionaría la vida jajaja.

He conseguido otra solución distinta a las anteriores, esta vez el codigo que os copio lleva incluidos todos los alerts que tengo puestos para saber hasta donde llega.
Consigue llegar hasta el alert 0,4, por lo tanto no me hace el xmlDoc.send(), ¿alguien sabría explicarme el porque de esto?

Código:
function ComprobarPersonaAlmacenada(nombre,apellido) { 
	alert('0');
	
	//----------------
	if (window.XMLHttpRequest){ // code for IE7+, Firefox, Chrome, Opera, Safari
	  xmlDoc = new XMLHttpRequest();
	  alert('0,1');
	}else{// code for IE6, IE5
	  xmlDoc =  ActiveXObject("Microsoft.XMLHTTP");
	  alert('0,2');
	}
	alert('0,3');
	xmlDoc.open("GET","personasAlmacenadas.xml",true);
	alert('0,4');
	xmlDoc.send();
	alert('0,5');
	
	xmlDoc = xmlhttp.responseXML; 
	alert('1');
	var txt = "";
	x = xmlDoc.getElementsByTagName("persona");
	alert('2');
	for (i=0;i<x.length;i++)
	{
	  if (x[i].getElementsByTagName("nombre").childNodes[0].nodeValue == nombre && x[i].getElementsByTagName("apellido").childNodes[0].nodeValue == apellido) {
		 alert('La persona está almacenada');
		 alert('3');
	  }
	}
	alert('4');
	alert('La persona no está almacenada'); 
};
De nuevo muchas gracias por todo lo que podais aportarme.

Saludos.

Última edición por c885; 25/05/2012 a las 04:15
  #5 (permalink)  
Antiguo 25/05/2012, 11:53
Avatar de emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Leer fichero XML

Un ejemplo simple de búsqueda en XML con javascript

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  2.    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  5. <title>Buscar en XML</title>
  6. <style type="text/css">
  7. /*<![CDATA[*/
  8. body{
  9. font-family: verdana, sans-serif;
  10. }
  11. h1{
  12. font-size: 16pt;
  13. }
  14. #resultados{
  15. margin: 30px 0;
  16. color: darkgreen;
  17. font-size: 11pt;
  18. }
  19. p,pre{
  20. font-size: 11pt;
  21. }
  22. pre{
  23. color: darkred;
  24. }
  25. /*]]>*/
  26. <script type="text/javascript">
  27. //<![CDATA[
  28. function buscarEnXML(urlXML,etiqueta){
  29. var xmlhttp;
  30. var txt,x,i,n,valor;
  31. var cadena = document.getElementById('el_nombre').value;
  32. cadena = cadena.replace(/(<([^>]+)>)/ig,"");
  33. // trim
  34. cadena = cadena.replace(/^\s+/g,'').replace(/\s+$/g,'');
  35. if(cadena == ""){
  36. document.getElementById("resultados").innerHTML='Ingrese un valor';
  37. return false;
  38. }
  39. if(cadena == '*'){
  40. cadena = ""; // mostrar todos
  41. }
  42. if(window.XMLHttpRequest){
  43. xmlhttp=new XMLHttpRequest();
  44. }else{
  45. xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  46. }
  47. xmlhttp.onreadystatechange=function(){
  48. if (xmlhttp.readyState==4 && xmlhttp.status==200){
  49. xmlDoc=xmlhttp.responseXML;
  50. txt="";
  51. losTags=xmlDoc.getElementsByTagName(etiqueta);
  52. for (i=0;i<losTags.length;i++){
  53. valor = losTags[i].childNodes[0].nodeValue;
  54. // Aqui la búsqueda, hay que refinarla, expresion regular, etc
  55. var er = new RegExp(cadena,"i");
  56. n=valor.search(er);
  57. //////////////////////////////////////
  58. if(n != -1){
  59. txt +=losTags[i].childNodes[0].nodeValue + "<br />";
  60. }
  61. }
  62. if( txt == ""){
  63. txt = 'Sin resultados';
  64. }
  65. document.getElementById("resultados").innerHTML=txt;
  66. }
  67. }
  68. xmlhttp.open("GET",urlXML,true);
  69. xmlhttp.send();
  70. }
  71. //]]>
  72. </head>
  73. <div>
  74. <h1>Buscar nombres en XML</h1>
  75. <input type="text" value="" id="el_nombre" />
  76. <input type="button" value="Buscar" onclick="buscarEnXML('http://vinoselfrances.com.ar/cdcatalog.xml','artist')" />
  77. <div id="resultados"></div>
  78. <p>El ejemplo busca en la etiqueta 'artist', es insensible a mayúsculas/minúsculas, para obtener todos los elementos del xml, ingrese <b>*</b><br />
  79. No hay mínimo de caracteres a ingresar.<br />
  80. La función de búsqueda recibe 2 parámetros, la url del xml y el nombre de la etiqueta en la que se quiere buscar.<br />
  81. </p>
  82. <pre><b>Ejemplo:</b><code>
  83. buscarEnXML('http://vinoselfrances.com.ar/cdcatalog.xml','artist')"
  84. </code></pre>
  85. <p>
  86. La url del XML es: <a href="http://vinoselfrances.com.ar/cdcatalog.xml">http://vinoselfrances.com.ar/cdcatalog.xml</a>
  87. </p>
  88. </div>
  89. </body>
  90. </html>

Tendrías que refinar los criterios de búsqueda si hace falta

Demo:
http://foros.emprear.com/xml/busqueda-xml.html

Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.
  #6 (permalink)  
Antiguo 25/05/2012, 17:31
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Leer fichero XML

Hola:

Otra referencia: Destripando objetos Ajax...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #7 (permalink)  
Antiguo 27/05/2012, 21:56
Avatar de djaevi  
Fecha de Ingreso: marzo-2007
Ubicación: Moreno, Buenos Aires
Mensajes: 400
Antigüedad: 17 años, 1 mes
Puntos: 47
Respuesta: Leer fichero XML

Hola te tengo buenas noticias investigando un poco he sacado una posible solucion al menos lo probe en mozilla y chrome y funciona ahi va el codigo:

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Documento sin título</title>
  5. <script type="text/javascript">
Código Javascript:
Ver original
  1. var xmlDoc;
  2.     function loadXML() {
  3.       xmlDoc=document.implementation.createDocument("","",null);
  4.       xmlDoc.load("archivo.xml");
  5.       xmlDoc.onload= readXML;
  6.     }
  7.  
  8.     function readXML() {
  9.         var nombre = document.usuarios.nombre.value;
  10.         var apellido = document.usuarios.apellido.value;
  11.         var root = xmlDoc.documentElement;
  12.         for (var i=0; i<root.childNodes.length; i++) {
  13.             var checkNombre = false;
  14.             var checkApellido = false;
  15.             if (root.childNodes[i].tagName == "persona") {
  16.                 for (var j=0; j<root.childNodes[i].childNodes.length; j++) {
  17.                     if ((root.childNodes[i].childNodes[j].tagName == "nombre") && (root.childNodes[i].childNodes[j].textContent == nombre)) {
  18.                         checkNombre = true;
  19.                         }
  20.                     if ((root.childNodes[i].childNodes[j].tagName == "apellido") && (root.childNodes[i].childNodes[j].textContent == apellido)) {
  21.                         checkApellido = true;
  22.                         }
  23.                     }
  24.                 }
  25.                 if ((checkNombre) && (checkApellido)) {
  26.                     alert("Esta Persona Ya Esta Registrada");
  27.                     break;
  28.                     }
  29.             }
  30.         if ((!checkNombre) || (!checkApellido)) {
  31.             alert("Esta Persona No Existe");
  32.             }
  33.      }
Código HTML:
Ver original
  1. </head>
  2.  
  3. <body">
  4.     <form name="usuarios" method="post" action="#">
  5.         Nombre: <input type="text" name="nombre" /><br />
  6.         Apellido: <input type="text" name="apellido" /><br /><br />
  7.         <input type="button" onclick="loadXML();" value="Comprobar"; />
  8.     </form>
  9. </body>
  10. </html>

Y aqui el xml, por lo que he visto no dejes espacios en blanco solo saltos de linea y tabulaciones.

Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2.     <personas>
  3.         <persona id="001" >
  4.             <nombre>Pablo</nombre>     
  5.             <apellido>Perez</apellido>
  6.         </persona>
  7.         <persona id="002">
  8.             <nombre>Diego</nombre>     
  9.             <apellido>Garcia</apellido>
  10.         </persona>
  11.     </personas>

Saludos

Etiquetas: fichero, html, xml
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:04.