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

Parsear XML cargado con mootools

Estas en el tema de Parsear XML cargado con mootools en el foro de Frameworks JS en Foros del Web. Saludos a todos. Seguro el tema es muy frecuente y muy básico, pero juro que he buscado e intentado toda la tarde y no he ...
  #1 (permalink)  
Antiguo 29/12/2009, 21:59
okram
Invitado
 
Mensajes: n/a
Puntos:
Parsear XML cargado con mootools

Saludos a todos. Seguro el tema es muy frecuente y muy básico, pero juro que he buscado e intentado toda la tarde y no he logrado dar con una solución práctica.

El problema es simple. Mediante la clase Request de Mootools obtengo un xml de la siguiente forma:

Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <response>
  3.     <error tipo="1">
  4.         <![CDATA[Error en la base de datos]]>
  5.     </error>
  6.     <html>
  7.         <![CDATA[<div class="error">No se pudo votar</div>]]>
  8.     </html>
  9.     <js>
  10.         <![CDATA[<script>....</script>º]]>
  11.     </js>
  12.     <redirect>www.algo.com</redirect>
  13. </response>
En resumen, lo que deseo hacer es, una vez obtenido este XML, poder en priemra instancia detectar si existe el tag <error>, lo cual indica que el proceso falló. Si existe, debo entonces obtener el valor de su atributo "tipo", y luego el contenido del nodo, para definir como proceder para cada tipo de error. Luego, lo mismo con los diferentes nodos posibles, como <html> o <redirect>.

Actualmente tengo esto (he recortado muchas partes que no importan ahora:

Código Javascript:
Ver original
  1. new Request({
  2.     method: 'get',
  3.     url: '/ajax',
  4.     data: {'id' : 561, 'request' : 'cap.votar' },
  5.     onSuccess: function(responseText, responseXML) {
  6.        
  7.         // Aqui es donde debo actuar. Deseo usar responseXML para obtener la información resultante del request
  8.  
  9.     }
  10. }).send();

Lo que hasta ahora he conseguido hacer, leyendo por aqui y por allá, es esto:

Detectar si un nodo existe o no:

Código Javascript:
Ver original
  1. if(responseXML.getElementsByTagName('error')[0]) {
  2.     // Existe
  3. } else {
  4.     // No existe
  5. }

Obtener el valor del atributo tipo:

Código Javascript:
Ver original
  1. responseXML.getElementsByTagName('error')[0].attributes.getNamedItem("tipo").nodeValue

Y finalmente, para leer el valor del nodo, según lo que leí, es diferente para IE y el resto:

Código Javascript:
Ver original
  1. // IE
  2. responseXML.getElementsByTagName('error')[0].text
  3.  
  4. // No IE
  5. responseXML.getElementsByTagName('error')[0].textContent

Básicamente esas son las 3 cosas que deseo lograr. La duda aquí es, que como evidentemente no manejo bien este tema de XML y javascript, tal vez lo estoy haciendo de un modo no muy adecuado, por lo que me gustaría que me ayuden a definir cuál sería la mejor manera de tratar esto, o si necesariamente hay que colocar código específico para distintos navegadores.

No sé si tenga que ver algo, pero como coloco en el título, el XML lo traigo usando Mootools.

Gracias!
  #2 (permalink)  
Antiguo 30/12/2009, 08:45
Avatar de mayid
Colaborador
 
Fecha de Ingreso: marzo-2009
Ubicación: BsAs
Mensajes: 4.014
Antigüedad: 15 años, 7 meses
Puntos: 101
Respuesta: Parsear XML cargado con mootools

Para mi fue un lio tambien encontrar informacion en su momento. Lamentablemente estoy de viaje y no tengo acceso a mis scripts, pero recuerdo que para evitar problemas con IE yo usaba la manera IE de procesar datos. Y que en el resto de los navegadores no tenia problemas.

Recien la semana proxima puedo responderte bien. Espero alguien mas te de una mano y resuelvas tus lineas.
  #3 (permalink)  
Antiguo 30/12/2009, 23:50
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: Parsear XML cargado con mootools

Para detectar si existe el nodo tambíen podrías verificar la propiedad length de la colección:
Código PHP:
alert(responseXML.getElementsByTagName('error').length); 
Para obtener el valor de un atributo, podrías usar getAttribute:
Código PHP:
alert(responseXML.getElementsByTagName('error')[0].getAttribute('tipo')); 
Y para obtener el valor del nodo, lo que considero más fiable es la propiedad data:
Código PHP:
alert(responseXML.getElementsByTagName('error')[0].firstChild.data); 
El problema que le veo en este caso en particular es que tenés espacios en tu xml, que navegadores como Firefox consideran un nodo
(responseXML.getElementsByTagName('error')[0].firstChild.nodeType seía igual a 3 y el valor de data no sería el que
estás esperando). Pero si antes eliminás los espacios en blanco en tu xml, podrías usar data sin problemas en
cualquier navegador.
  #4 (permalink)  
Antiguo 01/01/2010, 11:19
okram
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Parsear XML cargado con mootools

Gracias chicos por responder.

Sobre el length y getAttribute(), sí que no se me había ocurrido Gracias!

@Panino5001, para obtener el texto de un nodo al final logré hacerlo de una forma similar:

Código Javascript:
Ver original
  1. alert(responseXML.getElementsByTagName('error')[0].childNodes[0].nodeValue);

... y por las pruebas que hice va bien en FF 3 e IE 7 y 8. Es una propiedad también disponible en la mayor parte de navegadores (hablo del nodeValue vs. el data que me recomiendas)?

Por último, sobre los espacios en blanco en el xml. El XML lo genero en el script que procesa las peticiones asincronas usando DOMDocument de PHP. Existe entonces el riesgo de que ocurra lo que me mencionas? Porque hasta ahora no he tenido problemas con eso (sí cuando intenté trabajar con XML escritos "a mano").

Saludos, y gracias!
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 01:15.