Hola a todos.
Antes ya había usado los controles XMLHTTP en aplicaciones con VB y con C++, pero no había tenido un problema similar a este. Bueno, pues pongo el código en un documento HTML (ya intenté con VBS además de con JavaScript
), nada distinto a lo que he visto que ya publicado en este foro. Cargo el documento espero a que la función de CallBack devuelva un código de estado 4.
Hasta ese punto todo funciona bien. Cuando analizo el contenido del documento devuelto con
responseText, devuelve como se espera el texto de todo el documento XML en Firefox y en IE también. Pero, si trato de acceder a la estructura del documento con
responseXML, sólo me funciona en Firefox.
Ahora, en este punto, supuse que todo debía ser simplemente un problema con los tipos MIME. Así que reviso las asignaciones del servidor para los XML estáticos... Todo bien. Reviso que los XML que se generan dinámicamente tengan la indicación correcta (ASP: Response.ContentType = "text/xml")... todo está correctamente asignado. Supuse que de alguna manera el MIME no se estaba asignando, así que imaginen mi extrañeza al solicitar los encabezados de los XML desde mi script y ver que efectivamente tienen el MIME "text/xml" asignado. Si todo está bien asignado del lado del server, si efectivamente el server devuelve un xml (y ya verifiqué que esté bien formateado), si los navegadores con los que hice pruebas obtienen los datos de este XML como texto y además Firefox es capaz de usar la estructura de este XML, ¿porque IE no entrega la estructura del XML?
Al final me he rendido y puse una función extra sólo para crear el documento XML "real".
Código:
function get_DOM_DOC(XMLReq){
//Verificamos que la etiqueta del nodo raiz exista en el texto
//y si existe, verificamos si existe en la estructura XML
//en caso de que no exista, intentamos crear la estructura
//a partir del texto en responseText
if(XMLReq.responseText.indexOf("<datos>")!=-1 &&
XMLReq.responseXML.documentElement==null){
var xmlDoc;
//ProgIDs de los posibles ActiveX
var progIdDOM_DOC = [
"Msxml2.DOMDocument.4.0",
"Msxml2.DOMDocument.3.0",
"MSXML2.DOMDocument",
"MSXML.DOMDocument"];
for(var i=0; !_xmlDoc && i<progIdDOM_DOC.length; i++){
try {
xmlDoc = new ActiveXObject(progIdDOM_DOC[i]);
}catch(ex){
xmlDoc = false;
}
}
if(xmlDoc){
xmlDoc.async = false;
//El texto del documento es válido así que
//podemos crear un documento XML con él
xmlDoc.loadXML(XMLReq.responseText);
}
return xmlDoc;
}
return XMLReq.responseXML;
}
Una vez que tengo un objeto XMLHttpRequest (FF) o XMLHTTP (IE) válido, en la función de callBack, ahora uso este código:
Código:
if(xmlHTTP.status==200){
var xmlDOC = get_DOM_DOC(xmlHTTP);
//Sólo para verificar que existe una estructura XML válida
alert(xmlDOC.documentElement.nodeName);
}
Aqui fue donde me enteré que esta técnica se llama Ajax, buscando algo de información sobre el problema. Ahora mismo, ya funciona esto, y puedo acceder a la estructura del XML tanto en IE como FF usando la función anterior.
Pero, me queda la duda sobre IE, y aún más al ver que otros sencillos scripts en la red que toman
responseXML sin mayor preoucupación (no me funcionó ninguno). Todo lo que encontré funcionando usaba solamente
responseText que no sirve para mi aplicación.
Como seguramente ustedes tienen más experiencia en esto de AJAX y problemas con los nevegadores, espero que me puedan indicar cuál ha sido mi error.
Ah, y lo probé en los tres equipos que tengo a mano. Nunca funcionó con IE el método responseXML.
Saludos.