Подтвердить что ты не робот

Как получить всю XML-строку из XMLDocument, возвращаемого jQuery (кросс-браузер)?

Я попытался и не смог выяснить, как получить всю XML-строку из XMLDocument, возвращаемого GET. На SO есть много вопросов о том, как найти или заменить определенные элементы в объекте, но я не могу найти ответа на вопрос о том, как получить весь документ в виде строки.

Пример, с которым я работаю, - это здесь. "Делать что-то с xml" - часть, где я сейчас. У меня такое чувство, что это должно быть действительно тривиально, но я не знаю, как это сделать. Есть ли "xml.data()" или аналогичный, который может быть использован для этой цели?

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

Вариант использования заключается в том, что я хочу передать XML-флеш-плагин, и для этого мне нужен фактический XML в виде строки.

4b9b3361

Ответ 1

Мне нужен фактический XML как строка

Вы хотите, чтобы это был обычный текст вместо XML-объекта? Измените dataType от 'xml' до 'text'. Дополнительную информацию см. В $. Ajax documentation.

Ответ 2

Если вы хотите оба, получите ответ как XML-документ и как строку. Вы должны иметь возможность делать

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

Если вы хотите, чтобы это как строка, почему вы указываете dataType:xml, то не подходит ли dataType:text?

Ответ 3

Вы также можете легко преобразовать объект xml в строку, в java script:

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

Ответ 4

Если вам нужна только строка, представляющая xml, возвращаемый из jquery, просто установите свой тип данных как "текст", а не пытайтесь проанализировать xml обратно в текст. Следующее должно просто дать вам исходный текст обратно из вашего вызова 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
    }
});

Ответ 5

Хотя на этот вопрос уже был дан ответ, я хотел бы указать на предостережение: при извлечении XML с помощью jQuery с Internet Explorer вы ДОЛЖНЫ указать тип контента как "text/xml" (или "application/xml" ) или иначе вы не сможете анализировать данные, как если бы это был XML с помощью jQuery.

Возможно, вы думаете, что это очевидная вещь, но это поймало меня при использовании Mozilla/Chrome/Opera вместо IE. При извлечении "строки" XML с типом содержимого "текст" все браузеры, кроме IE, все равно позволят вам анализировать эти данные (с помощью селекторов jQuery), как если бы это был XML. IE не будет вызывать ошибку и просто не вернет никаких результатов в инструкцию выбора jQuery.

Итак, в вашем примере, если вам нужна только строка-сериализованная версия XML и не ожидает, что jQuery сделает какой-либо выбор в XML DOM, вы можете установить тип содержимого в "текст", Но если вам также нужно разбирать XML с помощью jQuery, вам нужно будет написать настраиваемую подпрограмму, которая сериализует XML в строку для вас, или же получить версию XML с типом содержимого "xml".

Надеюсь, что это поможет кому-то:)

Ответ 6

Вы можете получить собственный объект XMLHttpRequest, используемый в запросе. В то время, когда я отправляю этот ответ, jQuery docs заявляют несколько способов сделать это.

Один из них - через третий аргумент обратного вызова:

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

Для полного примера: https://jsfiddle.net/44m09r2z/