2009-11-04 14 views
38

He intentado y no he podido encontrar cómo obtener toda la cadena XML del XMLDocument devuelto por un GET. Hay muchas preguntas sobre SO sobre cómo encontrar o reemplazar elementos específicos en el objeto, pero parece que no encuentro ninguna respuesta sobre cómo obtener todo el documento como una cadena.¿Cómo obtengo la cadena XML completa de un XMLDocument devuelto por jQuery (navegador cruzado)?

El ejemplo con el que estoy trabajando es de here. La parte "hacer algo con xml" es donde estoy en este momento. Tengo la sensación de que esto debería ser realmente trivial, pero no sé cómo. ¿Existe un "xml.data()" o similar que pueda usarse para este propósito?

$.ajax({ 
    url: 'document.xml', 
    type: 'GET', 
    dataType: 'xml', 
    timeout: 1000, 
    error: function(){ 
     alert('Error loading XML document'); 
    }, 
    success: function(xml){ 
     // do something with xml 
    } 
}); 

El caso de uso es que quiero para alimentar el xml a plugin flash y para eso necesito el XML real como una cadena.

Respuesta

44

I need the actual XML as a string

¿Lo quiere como texto sin formato en lugar de objeto XML? Cambie dataType de 'xml' a 'text'. Vea el $.ajax documentation para más opciones.

+0

Gracias. Sabía que era trivial :) – icecream

+0

+1 Funciona a pesar de que no está documentado en [documentos que he encontrado] (http://api.jquery.com/jquery.get/). Gracias por el enlace ajax # options. –

52

Si desea ambas, obtenga la respuesta como documento XML y como cadena. Usted debe ser capaz de hacer

success: function(data){ 
    //data.xml check for IE 
    var xmlstr = data.xml ? data.xml : (new XMLSerializer()).serializeToString(data); 
    alert(xmlstr); 
} 

Si lo desea como cadena, ¿por qué no se especifica dataType:xml entonces dataType:text ser más apropiado?

+0

Si diseñé un objeto XML, ¿por qué no tendría una API para obtener los datos? – icecream

+0

El objeto XML es para obtener/manipular datos que están almacenados dentro del XML. Desea el XML en sí mismo, que es una cosa sutilmente diferente :) –

+0

¿Alguna extraña respuesta como BalusC pero ni un voto por arriba ni aceptado? – jitter

1

Si solo necesita una cadena que represente el xml devuelto por jquery, simplemente configure su tipo de datos en "texto" en lugar de intentar analizar el xml de nuevo en el texto. El siguiente solo debe darle texto crudo de vuelta de su ajax llamada:

$.ajax({ 
    url: 'document.xml', 
    type: 'GET', 
    dataType: 'text', 
    timeout: 1000, 
    error: function(){ 
     alert('Error loading XML document'); 
    }, 
    success: function(xml){ 
     // do something with xml 
    } 
}); 
1

Aunque esta pregunta ya ha sido contestada, quería señalar una advertencia: Al recuperar XML usando jQuery con Internet Explorer, MUST especifique el tipo de contenido como "text/xml" (o "application/xml") o de lo contrario no podrá analizar los datos como si fuera XML utilizando jQuery.

Usted puede estar pensando que esto es algo obvio, pero me sorprendió al usar Mozilla/Chrome/Opera en lugar de IE. Al recuperar una "cadena" de XML con un tipo de contenido de "texto", todos los navegadores excepto IE aún le permitirán analizar esos datos (utilizando los selectores jQuery) como si fuera XML. IE no arrojará un error y simplemente no devolverá ningún resultado a una declaración de selección jQuery.

Por lo tanto, en su ejemplo, siempre que solo necesite la versión en serie del XML y no espere que jQuery haga ningún tipo de selección en el DOM XML, puede establecer el tipo de contenido como "texto" ". Pero si TAMBIÉN necesita analizar el XML con jQuery, tendrá que escribir una rutina personalizada que serialice el XML en una cadena para usted, o bien recuperar una versión del XML con el tipo de contenido "xml".

la esperanza de que ayude a alguien :)

24

También puede convertir fácilmente un objeto XML en una cadena, en su java script:

var xmlString = (new XMLSerializer()).serializeToString(xml); 
+0

[la respuesta de jitter] (http://stackoverflow.com/a/1675058/516229) es mejor porque es compatible con IE también. – ZiggyTheHamster

+3

Parece que no funciona para mí: TypeError: el argumento 1 de XMLSerializer.serializeToString no implementa el Nodo de interfaz. – Yster

1

Usted puede obtener el objeto XMLHttpRequest nativa utilizada en la petición. En el momento en que estoy publicando esta respuesta, jQuery docs indica algunas maneras de hacerlo.

Una de ellas es a través del tercer argumento de la devolución de llamada de éxito:

success: function(xml, status, xhr){ 
    console.log(arguments); 
    console.log(xhr.responseXML, xhr.responseText); 
    console.log('Finished!'); 
} 

Para un ejemplo completo: https://jsfiddle.net/44m09r2z/

Cuestiones relacionadas