Foros del Web » Programando para Internet » Javascript »

ajax+php nodeName indices pares =#text

Estas en el tema de ajax+php nodeName indices pares =#text en el foro de Javascript en Foros del Web. ayer empece a estudiar javascript y me encontré con un problema a la hora de leer un archivo xml devuelto por un script php. Primero ...
  #1 (permalink)  
Antiguo 06/08/2013, 18:57
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 13 años
Puntos: 25
ajax+php nodeName indices pares =#text

ayer empece a estudiar javascript y me encontré con un problema a la hora de leer un archivo xml devuelto por un script php. Primero les muestro el codigo JS y el PHP:

Código Javascript:
Ver original
  1. function cargarProductos(producto){
  2.    
  3.     var httpRequest;
  4.     if (window.XMLHttpRequest)
  5.     {
  6.             //El explorador implementa la interfaz de forma nativa
  7.             httpRequest = new XMLHttpRequest();
  8.     }
  9.     else if (window.ActiveXObject)
  10.     {
  11.             //El explorador permite crear objetos ActiveX
  12.             try {
  13.                     httpRequest = new ActiveXObject("MSXML2.XMLHTTP");
  14.             } catch (e) {
  15.                     try {
  16.                             httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
  17.                     } catch (e) {}
  18.             }
  19.     }
  20.    
  21.        
  22.     httpRequest.onreadystatechange = function() {
  23.         if (httpRequest.readyState == 4) {
  24.             if (httpRequest.status ==200){
  25.  
  26.             //se establece que es un archivo xml lo que se recibe y se parsea    
  27.             var parser = new DOMParser();
  28.             var xmlDoc = parser.parseFromString(httpRequest.responseText, "application/xml");
  29.  
  30.             /*
  31.             cuerpo
  32.             <root>
  33.                 <producto>
  34.                     <nombre>...</nombre>
  35.                     <idcategoria>...</idcategoria>
  36.                 </producto>
  37.                 <producto>
  38.                     <nombre>...</nombre>
  39.                     <idcategoria>...</idcategoria>
  40.                 </producto>
  41.                 ...
  42.                 </producto>
  43.             </root>
  44.             */
  45.             var root= xmlDoc.getElementsByTagName("producto");
  46.            
  47.            
  48.             for (var i=0; i< root.length; i++){
  49.                
  50.                 //se debe de saltar de 2 en 2 en cada nodo hijo
  51.                 //los indices pares no tienen texto
  52.                 var nombre= root[i].childNodes[1].textContent;
  53.                 var idCategoria= root[i].childNodes[3].textContent;
  54.  
  55.                 //muestra #text en todos los indices pares
  56.                 alert(root[i].childNodes[0].nodeName);
  57.                
  58.                 //se añade el fieldset con los datos correspondientes
  59.                 var divisor= document.getElementById("productos");
  60.                 var campo= document.createElement("fieldset");
  61.                 var texto= document.createTextNode("Nombre= "+nombre+" idcategoria= "+idCategoria);
  62.                 campo.appendChild(texto);
  63.                 divisor.appendChild(campo);
  64.             }
  65.             }  
  66.         }      
  67.     }
  68.    
  69.     httpRequest.open('GET', '../ajax/ObtenerProductos.php?math=' + Math.random(), true);
  70.     httpRequest.send(null);
  71.  
  72.     return false;
  73. }

Código PHP:
Ver original
  1. <?php
  2.  
  3. $_Root= $_SERVER['DOCUMENT_ROOT'];
  4.  
  5. require_once $_Root.'/ProductoDAO.php';
  6.  
  7. $_Consulta= ProductoDAO::BuscarTodosPorCategoria('pizza');
  8.  
  9. $doc = new DOMDocument();
  10. $doc->formatOutput= true;
  11.  
  12. $root = $doc->createElement('root');
  13. $root = $doc->appendChild($root);
  14.  
  15.  
  16. foreach ($_Consulta as $Datos){
  17.    
  18. $producto= $doc->createElement('producto');
  19. $producto= $root->appendChild($producto);
  20.  
  21.  
  22. $nombreTag = $doc->createElement('nombre');
  23. $nombreTag = $producto->appendChild($nombreTag);
  24.  
  25. $textNombre = $doc->createTextNode($Datos->getNombre());
  26. $textNombre = $nombreTag->appendChild($textNombre);
  27.  
  28. $idCategoria= $doc->createElement('idcategoria');
  29. $idCategoria= $producto->appendChild($idCategoria);
  30.  
  31. $textIDCategoria= $doc->createTextNode($Datos->getCategoria());
  32. $textIDCategoria= $idCategoria->appendChild($textIDCategoria);
  33.    
  34. }
  35.  
  36. echo $doc->saveXML();
  37. ?>


el problema lo puse en el alert(root[i].childNodes[0].nodeName); en la linea 56 del JS. Me muetra #text con cualquier indice par, o sea, al xml se le agregan datos que no los puse yo.



si necesitan mas informacion pidanla, recien estoy comenzando con JS y me costo mucho esto, pero no entiendo esa parte .

saludos
  #2 (permalink)  
Antiguo 06/08/2013, 19:17
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 8 meses
Puntos: 1284
Respuesta: ajax+php nodeName indices pares =#text

Hola:

Un salto de línea, un tabulador o un simple espacio equivale a un nodo de texto... Normalmente creo mis xml de forma manual, así que no tengo idea de como queda la salida que generas...

Para evitar problemas suelo usar getElementsByTagName...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 06/08/2013, 19:49
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 13 años
Puntos: 25
Respuesta: ajax+php nodeName indices pares =#text

efectivamente parece ser eso. SI hago solamente un include del archivo php, el codigo fuente queda como sigue:

Código HTML:
Ver original
  1. <?xml version="1.0"?>
  2. <root>
  3.   <producto>
  4.     <nombre>nombreProducto1</nombre>
  5.     <idcategoria>idCategoriaProducto1</idcategoria>
  6.   </producto>
  7.   <producto>
  8.     <nombre>nombreProducto2</nombre>
  9.     <idcategoria>idCategoriaProducto2</idcategoria>
  10.   </producto>
  11.   <producto>
  12.     <nombre>nombreProducto3</nombre>
  13.     <idcategoria>idCategoriaProducto3</idcategoria>
  14.   </producto>
  15. </root>
  16. </body>
  17. </html>
  18.  
  19.  
  20. se puede ver cada salto de linea. Voy a ver como lo resuelvo, si uso tu técnica o si soluciono el problema de otra manera ;-).
  21.  
  22. gracias
  #4 (permalink)  
Antiguo 06/08/2013, 21:02
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 13 años
Puntos: 25
Respuesta: ajax+php nodeName indices pares =#text

Bien, parece que el problema esta por el lado de PHP obviamente. Dejo la solución por si alguien tiene el mismo problema.


Resulta que la linea que sigue:

Código PHP:
Ver original
  1. $doc->formatOutput= true;

Formatea el archivo xml para que los navegadores los puedan presentar de una forma legible.
Cambiando true por false se corregiria mi problema y se eliminarian todos los saltos de linea, tabulaciones y espacios insertados por el mismo objeto php.
Ahora pude obtener la siguiente salida:

Código HTML:
Ver original
  1. <?xml version="1.0"?>
  2. <root><producto><nombre>Producto1</nombre><idcategoria>idCategoriaProducto1</idcategoria></producto><producto><nombre>Producto2</nombre><idcategoria>idCategoriaProducto2</idcategoria></producto><producto><nombre>Producto3</nombre><idcategoria>idCategoriaProducto3</idcategoria></producto></root>
  3. </body>
  4. </html>

esta salida me sirve para que mi codigo javascript funcione correctamente sin tener que aumentar de a 2 el indice de la lista de nodos hijos:

Código Javascript:
Ver original
  1. function cargarProductos(producto){
  2.    
  3.     var httpRequest;
  4.     if (window.XMLHttpRequest)
  5.     {
  6.             //El explorador implementa la interfaz de forma nativa
  7.             httpRequest = new XMLHttpRequest();
  8.     }
  9.     else if (window.ActiveXObject)
  10.     {
  11.             //El explorador permite crear objetos ActiveX
  12.             try {
  13.                     httpRequest = new ActiveXObject("MSXML2.XMLHTTP");
  14.             } catch (e) {
  15.                     try {
  16.                             httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
  17.                     } catch (e) {}
  18.             }
  19.     }
  20.    
  21.    
  22.     httpRequest.onreadystatechange = function() {
  23.         if (httpRequest.readyState == 4) {
  24.            
  25.             if (httpRequest.status ==200){
  26.  
  27.                    
  28.             var parser = new DOMParser();
  29.             var xmlDoc = parser.parseFromString(httpRequest.responseText, "application/xml");
  30.  
  31.            
  32.             var root= xmlDoc.getElementsByTagName("producto");
  33.  
  34.             for (var i=0; i<root.length; i++){         
  35.            
  36.                 var nombre= root[i].childNodes[0].textContent;
  37.                
  38.                 var idCategoria= root[i].childNodes[1].textContent;
  39.                
  40.                 var divisor= document.getElementById("productos");
  41.                 var campo= document.createElement("fieldset");
  42.                 var texto= document.createTextNode("Nombre= "+nombre+" idcategoria= "+idCategoria);
  43.                 campo.appendChild(texto);
  44.                 divisor.appendChild(campo);
  45.             }
  46.             }
  47.            
  48.            
  49.             }else alert(httpRequest.readyState);
  50.            
  51.         }
  52.    
  53.     httpRequest.open('GET', '../ajax/ObtenerProductos.php?math=' + Math.random(), true);
  54.     httpRequest.send(null);
  55.  
  56.     return false;
  57. }

Como se pueden ver en las lineas 36 y 38, accedo a los nodos hijos con los indices correctos.

ahora a seguir con esto que me está sacando la cabeza
  #5 (permalink)  
Antiguo 07/08/2013, 14:29
Avatar de andinog  
Fecha de Ingreso: febrero-2012
Mensajes: 50
Antigüedad: 12 años, 10 meses
Puntos: 6
Respuesta: ajax+php nodeName indices pares =#text

No entiendo por que tu respuesta XML tiene estructura HTML.

Probaste utilizar en PHP

Código PHP:
Ver original
  1. header ("Content-Type:text/xml");

Y eliminar las etiquetas html que envuelven el codigo XML

Saludos!
__________________
"El que nada duda nada sabe"
Ser Programador
  #6 (permalink)  
Antiguo 07/08/2013, 16:35
 
Fecha de Ingreso: diciembre-2011
Ubicación: Crespo - Entre Rios
Mensajes: 155
Antigüedad: 13 años
Puntos: 25
Respuesta: ajax+php nodeName indices pares =#text

en realidad no me devuelve etiquetas html, esas las puse yo y no aclare :D. Me devuelve esto:

Código XML:
Ver original
  1. <?xml version="1.0"?>
  2. <root><producto><nombre>Producto1</nombre><idcategoria>idCategoriaProducto1</idcategoria></producto><producto><nombre>Producto2</nombre><idcategoria>idCategoriaProducto2</idcategoria></producto><producto><nombre>Producto3</nombre><idcategoria>idCategoriaProducto3</idcategoria></producto></root>

Etiquetas: ajax, ajax-php, indices, js, php, text
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 14:28.