Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Problema al recibir responseXML

Estas en el tema de Problema al recibir responseXML en el foro de Frameworks JS en Foros del Web. Hola a todos, estoy practicando con AJAX, y primero probe a utilizar responseText y funcionaba correctamente, pero al intentar cambiar el codigo para utilizar responseXML ...
  #1 (permalink)  
Antiguo 23/03/2009, 16:54
 
Fecha de Ingreso: diciembre-2005
Mensajes: 92
Antigüedad: 18 años, 10 meses
Puntos: 0
Problema al recibir responseXML

Hola a todos, estoy practicando con AJAX, y primero probe a utilizar responseText y funcionaba correctamente, pero al intentar cambiar el codigo para utilizar responseXML tengo problemas al intentar acceder al archivo que recibo generado con PHP.

Tengo este codigo PHP, que hace una consulta a la base de datos y me devuelve el numero de filas encontradas que es el valor que quiero pasar en la variable &a. Yo creo que el archivo este va bien:

Código PHP:
<?php
require_once("php/php.php");

$formUsuario $_POST['usuario'];
$control$_POST['control'];

switch (
$control){
    case 
"usuario"
        
$nombremysql_escape_string($formUsuario)    ;            
        
$servidor "xxxxxxxxx";
        
$usuario "xxxxxxx";
        
$pass "xxxxxxxx";
        
$base_datos "xxxxxxxx";
        
$mysql "select * from general WHERE nombre='{$nombre}' ";
        
$conexion = new Servidor_Base_Datos($servidor,$usuario,$pass,$base_datos);
        
$conexion-> consulta($mysql);
        
$a =$conexion->numero_filas();

        
$xml=  "<?xml version=\"1.0\" encoding=\"utf-8\" ?>";
        
$xml.= "<Valida>";
        
//echo "<control>".$a."</control>";

// He probado con CDATA y Sin CDATA obteniendo el mismo resultado

        
$xml.="<Control>![CDATA[$a]]</Control>";
        
$xml.="</Valida>";
        
header("Content-type:text/xml");
        echo 
$xml;
    break;
     case 
2:
    
alert("no");
    break;
    default:
    echo(
"no va");

}
   
?>
Estoy trabajando con Firebug y este indica que la respuesta recibida del servidor es :

<?xml version="1.0" encoding="utf-8" ?><Valida><Control>![CDATA[1]]</Control></Valida>

Si realizo alert("Estado: " + ajax.status + "\nMotivo: " + ajax.statusText);

obtengo

Estado: 200
Motivo: OK


Yo creo que se produce la recepcion pero el problema viene al intentar sacar los datos recibidos mediante DOM. Os pongo el codigo que utilizo y el error que da el firebug:

Cita:

var documento = ajax.responseXML;
var root = documento.getElementsByTagName('Valida')[0];
var info = root.getElementsByTagName('Control')[0].firstChild.nodeValue;
El programa se para al llegar a la fila de root mostrando el siguiente error:

root is undefined
onreadystatechange()()index.js (línea 376)
[Break on this error] var info = root.getElementsByTagName('Control')[0].firstChild.nodeValue


Espero que me podais ayudar porque llevo unos dias atascado en este punto y no encuentro la solucion.

Salu2
  #2 (permalink)  
Antiguo 23/03/2009, 18:42
Avatar de fallenagus  
Fecha de Ingreso: noviembre-2008
Ubicación: Santa Cruz - Bolivia
Mensajes: 52
Antigüedad: 16 años
Puntos: 2
Respuesta: Problema al recibir responseXML

bueno yo sabia que la función "getElementsByTagName()" solo era para llamar a elementos según el nombre de tag que tenían por ejemplo: quiero tener algún div hago esto: "getElementsByTagName('div')" y eso me devuelve un array con todos los div que hay en mi pagina. por eso creo que te dice que root no esta definido o es nulo.

intenta usar "getElementById()" si es que tu elemento tiene como id "Valida" o "getElementsByName()" si tiene "Valida" como name, pero para obtener un solo elemento del html la mejor manera es con "getElementById()" siempre y cuando el id de tu elemento sea único en tu pagina.
  #3 (permalink)  
Antiguo 23/03/2009, 19:01
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Respuesta: Problema al recibir responseXML

Hola, fallenagus.

getElementsByTagName forma parte del estándar DOM, y en el caso explicado está bien empleado.

Y, respondiendo a la pregunta del usuario, resulta raro el fallo, yo probé con un XML igual y funcionó sin problemas .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #4 (permalink)  
Antiguo 24/03/2009, 08:11
 
Fecha de Ingreso: diciembre-2005
Mensajes: 92
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: Problema al recibir responseXML

Yo por lo que veo en internet, en los ejemplos que pone la gente y en foros, el uso de getElementsByTagName() es correcto.
El problema es que declara la variable root como nula o indefinida y no veo el problema porque recibir texto si que recibe, pero o no lo ve como documento xml bien formateado o no deja acceder a el.

Puede ser problema de las cabeceras o del encoding="utf-8"?? Eske ya no se que cambiar.
  #5 (permalink)  
Antiguo 25/03/2009, 16:38
 
Fecha de Ingreso: diciembre-2005
Mensajes: 92
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: Problema al recibir responseXML

Sigo peleandome con el tema-

He incluido en el codigo unos alert:

Código PHP:
 alert documento.getElementsByTagName('Valida').length ); 
                                
alert documento.getElementsByTagName('Control').length ); 
El resultado de los dos es 0 por lo que no encuentra o no ve los nodos que estoy llamando y no se si es que al genarar el XML desde XML estara mal o es que por algun motivo no se recibe bien la respuesta.

Sigo buscando
  #6 (permalink)  
Antiguo 25/03/2009, 18:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Problema al recibir responseXML

Hola pepepercebe,

Te hace falta poner en tu archivo PHP:
Código php:
Ver original
  1. header( 'Content-type: text/xml' );

Para que cuando recibas la respuesta en el XML Javascript cree el nodo de responseXML.

Saludos.
  #7 (permalink)  
Antiguo 27/03/2009, 19:56
 
Fecha de Ingreso: diciembre-2005
Mensajes: 92
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: Problema al recibir responseXML

Hola GatorV, la cabecera si quee staba definida, aunque si te fijas no estaba en la primera linea. De todas maneras la puse tambien en la primera fila y nada.

Despues de buscar y rebuscar, y probar mil variantes del codigo, he conseguido que funcione pero no me explico porque.

La cuestion es que vi un ejemplo que saca el codigo del XML de dentro del codigo del PHP, lo probe y funciona.

Esto es como se me ha quedado el fichero php:

Código PHP:
<?php
header
("Content-type:text/xml");
header("Cache-Control: no-cache, must-revalidate");
require_once(
"php/php.php");

$formUsuario $_POST['usuario'];
        
$nombremysql_escape_string($formUsuario)    ;            
        
$servidor "xxxxxxx";
        
$usuario "xxxxx";
        
$pass "xxxx";
        
$base_datos "xxxxxx";
        
$mysql "select * from general WHERE nombre='{$nombre}' ";
        
$conexion = new Servidor_Base_Datos($servidor,$usuario,$pass,$base_datos);
        
$conexion-> consulta($mysql);
        
$a =$conexion->numero_filas();
        
        
$err '';
        
$err .= $HTTP_POST_VARS["var"]."<br>";
        
$result 1;
        
        
?>
        <Valida>        
        <Control><?php
        
echo '<![CDATA[';
        echo 
$a;
        echo 
']]>';
        
?></Control>
        </Valida>
Como veis he sacado todo el codigo del xml, excepto la parte dinamica, de dentro del codigo php y ahora si que se recibe el codigo como xml y antes no.
A mi con esto ya me vale, pero si alguien me sabe decir porque esto es asi lo agradeceria.

Muchas gracias.
  #8 (permalink)  
Antiguo 27/03/2009, 20:26
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Respuesta: Problema al recibir responseXML

Fijate cómo estaba definido CDATA en tu primer código (faltaban los <>)
  #9 (permalink)  
Antiguo 18/05/2009, 06:26
 
Fecha de Ingreso: diciembre-2005
Mensajes: 92
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: Problema al recibir responseXML

Hola, he conseguido crear una respuesta xml con php , os voy a poner lo que recibo segun firebug:

<?xml version="1.0"?>
<numFilas> 3 </numFilas>
<usuarios>
<idUsuario>1</idUsuario>
<usuario>serro</usuario>
<nombre>Ximo</nombre>
</usuarios>

<usuarios>
<idUsuario>2</idUsuario>
<usuario>gonzales</usuario>
<nombre>Juan Carlos</nombre>
</usuarios>

<usuarios>
<idUsuario>3</idUsuario>
<usuario>tabar</usuario>
<nombre>Juan</nombre>
</usuarios>

intento acceder a los datos de esta manera y el alert siempre me da undefined

var documento = ajax.responseXML;
var xmlUsuarios = documento.getElementsByTagName('usuarios').[0];
var xmlNombre = xmlUsuarios.getElementsByTagName('nombre')[0];
alert(xmlNombre.firstChild.data) ;

No encuentro la manera de acceder a los datos que recibo en la respuesta.
  #10 (permalink)  
Antiguo 18/05/2009, 08:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Problema al recibir responseXML

Esto es incorrecto: var xmlUsuarios = documento.getElementsByTagName('usuarios').[0], debe de ser: var xmlUsuarios = documento.getElementsByTagName('usuarios')[0];

Saludos.
  #11 (permalink)  
Antiguo 18/05/2009, 09:29
 
Fecha de Ingreso: diciembre-2005
Mensajes: 92
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: Problema al recibir responseXML

Gracias Gator, pero continua sin funcionar. he probado tantas lineas de codigo y he intentado tantas cosas que ya no se ni lo que he pegado en el foro...

A ver , primera duda, que debo de poner o en que se diferencia el usar esto:

var documento = ajax.responseXML; //.documentElement
o esto:
var documento = ajax.responseXML.documentElement;

Continuo con esto:
var xmlUsuarios = documento.getElementsByTagName('usuarios').length;
alert(xmlUsuarios) ; // imprime 0 , asi que entiendo que no lee el xml
var xmlUsuarios = documento.getElementsByTagName('usuarios')[0];
alert(documento) ; // imprime [object XMLDocument] por lo que parece que si que reconoce la respuesta como xml
alert(xmlUsuarios) ; // imprime undefined

Bueno sabriais decirme que me esta fallando??
  #12 (permalink)  
Antiguo 18/05/2009, 14:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Problema al recibir responseXML

Es ajax.responseXML lo más adecuado, prueba hacer esto:
Código javascript:
Ver original
  1. var xmlUsuarios = ajax.responseXML;
  2. var aUsuarios = xmlUsuarios.getElementsByTagName('usuarios');
  3. alert(aUsuarios);

Si te muestra object es que si lo esta leyendo, en caso contrario es que tu respuesta XML no tiene ningun nodo de <usuarios>.

Saludos.
  #13 (permalink)  
Antiguo 18/05/2009, 16:16
 
Fecha de Ingreso: diciembre-2005
Mensajes: 92
Antigüedad: 18 años, 10 meses
Puntos: 0
Respuesta: Problema al recibir responseXML

Hola Gator, he hecho lo siguiente, que es lo que me has indicado:

var documento = ajax.responseXML;
var aUsuarios = documento.getElementsByTagName('usuarios');
alert (aUsuarios);

y el alert me muestra :

[object HTMLCollection]

Tambien he hecho :

var documento = ajax.responseXML;
var aUsuarios = documento.getElementsByTagName('usuario');
alert (aUsuarios);

y el resultado es el mismo que el anterior.

He cambiado el xml , pienso que antes no estba bien estructurado, creo que asi esta mejor. Ahora obtengo este xml como respuesta:

<?xml version="1.0"?>
<usuarios>
<numFilas>3</numFilas>
<usuario>
<idUsuario>1</idUsuario>
<user>jserra</user>
<nombre>Ximo</nombre>
</usuario>
<usuario>
<idUsuario>2</idUsuario>
<user>cgonzalez</user>
<nombre>Juan Carlos</nombre>
</usuario>
<usuario>
<idUsuario>3</idUsuario>
<user>jtebar</user>
<nombre>Juan</nombre>
</usuario>
</usuarios>


La pregunta que me hago es como conseguir acceder a los nodos secundarios de usuario como son idUsuario, nombre y user.

Estoy aqui atascado y no hay manera.
  #14 (permalink)  
Antiguo 18/05/2009, 17:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Problema al recibir responseXML

Pues es un poco más simple:
Código javascript:
Ver original
  1. var documento = ajax.responseXML;
  2. var aUsuarios = documento.getElementsByTagName('usuario');
  3. for( var i = 0; i < aUsuarios.length; i++ ) {
  4.       var usuario = aUsuarios[i];
  5.       var idUsuario = usuario.getElementsByTagName('idUsuario').firstChild.data;
  6. }

Saludos.
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 08:53.