#php #jquery #xml
#php #jquery #xml
Вопрос:
У меня странная проблема, связанная с типом данных jQuery.
У меня есть очень простая PHP-программа, которая возвращает (echo) XML-файл (строку). Выглядит так:
$xmlFile = "sampleXMLFile.xml";
$xml = simplexml_load_file($xmlFile);
echo $xml->saveXML();
Мой клиентский / javascript-код вызывает php-программу через ajax:
$(document).ready(function()
{
$.ajax({
type: "GET",
url: "myPHPFile.php",
dataType: "xml",
success: myCompleteFunction,
complete: mySuccessFunction,
failure: function(data) {
alert("Problem getting XML");
} });
});
«myCompleteFunction» принимает XML и просто записывает первый узел в элемент div, например:
function myCompleteFunction(xml)
{
$(xml).find("Row").each(function()
{
$("#result3").append($(this).attr("myrow"));
});
}
ХОРОШО — в IE 8 это работает нормально. В Firefox и Chrome я не получаю никаких результатов. Однако, если я изменю тип данных на «html», я получу правильные результаты в Firefox и Chrome, а затем не получу результатов в IE. ‘
Продолжайте сходить с ума от этого. Мне действительно нужно вводить условную логику для браузеров?
Параметр DataType:, описанный в руководстве по jQuery, кажется достаточно понятным. Я даже пытался оставить тип данных
(согласно руководству: если не указано ни одного, jQuery попытается вывести его на основе MIME-типа ответа)
Я также пробовал несколько типов — например, «текстовый xml». Ничего хорошего.
Кто-нибудь когда-нибудь сталкивался с этой проблемой? Приветствуется любое направление.
Спасибо.
ps Я знаю, что могу прочитать XML-файл в jQuery. Результирующий XML из программы PHP будет значительно более сложным. Я использовал это только в качестве примера.
Обновлено:
Ну, я видел комментарий Фила о создании чего-либо перед отправкой XML-данных. Конечно, не было ничего очевидного. Я удалил пустую строку над моей первой <?php
строкой. Это каким-то образом сработало! Мне все еще кажется странным. Итак, мой новый, более жесткий PHP-код теперь:
<?php
// Load XML
$xmlFile = "sample.xml";
$xml = simplexml_load_file($xmlFile);
header('Content-type: text/xml');
echo $xml->saveXML();
?>
Я также обращу внимание на ваше другое предложение о правильной обработке обратных вызовов jQuery.ajax(). Спасибо.
Я очень ценю вашу помощь с этим!!
Ответ №1:
Придерживайтесь «xml» dataType
и добавьте это в свой PHP-файл перед echo
…
header('Content-type: text/xml');
Кроме того, вы, кажется, путаете некоторые jQuery.ajax()
обратные вызовы.
- Используется
success
для обработки возвращаемых данных. - Использовать
error(jqXHR, textStatus, errorThrown)
(неfailure
) для обработки HTTP-ошибок - Используется
complete
для выполнения некоторых задач послеsuccess
error
выполнения обратных вызовов и
Комментарии:
1. Пробовал это без удачи <pre> $xmlFile = «sample.xml «; $xml = simplexml_load_file($xmlFile); заголовок(‘Content-type: text/xml’); echo $xml->saveXML(); </pre> Получить это и никаких результатов. Предупреждение: невозможно изменить информацию заголовка — заголовки, уже отправленные
2. @Rob В этом случае у вас есть что-то, создающее выходные данные до отправки XML-данных. Вы определенно этого не хотите. Кроме того, отредактируйте свой вопрос, чтобы добавить больше кода / сообщений. Не пытайтесь опубликовать это в комментариях
3. Ну, я видел комментарий Фила о создании чего-либо перед отправкой XML-данных. Конечно, не было ничего очевидного. Я удалил пустую строку над моей первой
<?php
строкой. Это каким-то образом сработало! Мне все еще кажется странным. Я также обращу внимание на ваше другое предложение о правильной обработке обратных вызовов jQuery.ajax(). Спасибо. Я очень ценю вашу помощь с этим!!