web-dev-qa-db-fra.com

Comment puis-je obtenir la chaîne XML entière d'un XMLDocument retourné par jQuery (navigateur croisé)?

J'ai essayé et échoué pour savoir comment obtenir la chaîne XML entière du XMLDocument retourné par un GET. Il y a beaucoup de questions sur SO sur la façon de trouver ou de remplacer des éléments spécifiques dans l'objet, mais je n'arrive pas à trouver de réponse sur la façon d'obtenir le document entier sous forme de chaîne.

L'exemple avec lequel je travaille vient de ici . La partie "faire quelque chose avec xml" est où je suis en ce moment. J'ai l'impression que cela devrait être vraiment insignifiant, mais je ne sais pas comment. Existe-t-il un "xml.data ()" ou similaire qui peut être utilisé à cet effet?

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

Le cas d'utilisation est que je veux alimenter le plugin xml en flash et pour cela j'ai besoin du XML réel sous forme de chaîne.

40
icecream

J'ai besoin du XML réel sous forme de chaîne

Vous le voulez en texte brut au lieu d'un objet XML? Changer dataType de 'xml' à 'text'. Voir la documentation $. Ajax pour plus d'options.

44
BalusC

Si vous voulez les deux, obtenez la réponse sous forme de document XML et sous forme de chaîne. Tu devrais pouvoir faire

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

Si vous le voulez comme chaîne, pourquoi spécifiez-vous dataType:xml ne serait pas alors dataType:text être plus approprié?

54
jitter

Vous pouvez également facilement convertir un objet xml en chaîne, dans votre script Java:

var xmlString = (new XMLSerializer()).serializeToString(xml);
23
Paul Gorbas

Si vous n'avez besoin que d'une chaîne représentant le xml renvoyé par jquery, définissez simplement votre type de données sur "texte" plutôt que d'essayer de réanalyser le xml en texte. Ce qui suit devrait simplement vous rendre le texte brut de votre appel ajax:

$.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
Ryan Brunner

Bien que cette question ait déjà reçu une réponse, je voulais souligner une mise en garde: lors de la récupération de XML à l'aide de jQuery avec Internet Explorer, vous DEVEZ spécifier le type de contenu à "text/xml" (ou "application/xml"), sinon vous ne pourrez pas analyser les données comme s'il s'agissait de XML à l'aide de jQuery.

Vous pensez peut-être que c'est une chose évidente, mais cela m'a pris lors de l'utilisation de Mozilla/Chrome/Opera au lieu d'IE. Lors de la récupération d'une "chaîne" de XML avec un type de contenu de "texte", tous les navigateurs à l'exception de IE vous permettront toujours d'analyser ces données (en utilisant les sélecteurs jQuery) comme s'il s'agissait de XML. IE ne générera pas d'erreur et ne renverra tout simplement aucun résultat à une instruction de sélection jQuery.

Ainsi, dans votre exemple, tant que vous n'avez besoin que de la version sérialisée en chaîne du XML et que vous ne vous attendez pas à ce que jQuery effectue une quelconque sélection sur le DOM XML, vous pouvez définir le type de contenu sur "texte". Mais si vous avez également besoin d'analyser le XML avec jQuery, vous devrez écrire une routine personnalisée qui sérialise le XML en une chaîne pour vous, ou bien récupérer une version du XML avec le type de contenu "xml".

J'espère que cela aide quelqu'un :)

1
vmfedor

Vous pouvez obtenir l'objet XMLHttpRequest natif utilisé dans la demande. Au moment où je poste cette réponse, les documents jQuery indiquent quelques façons de le faire.

L'un d'eux est via le troisième argument du rappel de réussite:

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

Pour un exemple complet: https://jsfiddle.net/44m09r2z/

1
RibeiroBreno