ResponseXML всегда null
Я использую firefox 3.6.10 и firebug для отладки
Итак, вот мой код:
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", url,false);
xmlhttp.setRequestHeader('Content-Type', 'text/xml');
xmlhttp.send(null);
alert(xmlhttp.responseXML);
responseXML всегда имеет значение null, и я пробовал его по нескольким URL-адресам из разных доменов. Я также пробовал это асинхронно, это тот же результат. responseText всегда возвращается правильно, никаких проблем с ним.
Моя цель - получить responseXML.documentElement.
Спасибо за вашу помощь.
EDIT -----------
Этот код javascript был выполнен из почтового индекса Greasemonkey, и я сделал surte его то же происхождение, что и запрошенный url. Также я попробовал выполнить с консоли firebug, снова обеспечив исходную политику. Такая же ошибка для обоих.
Должен ненавидеть javascript.
Ответы
Ответ 1
Держу пари, что вы нарушаете ту же политику происхождения.
Для XHR вы должны иметь один и тот же протокол, домен, порт и т.д. Поэтому, если вы используете приложение на localhost: 8080/app, вы НЕ МОЖЕТЕ ajax на www.cnn.com.
Различные браузеры обрабатывают это по-другому; Я видел, как FF делает то, что вы описываете, и запрос кажется возвращенным нормально, но данных нет...
Ответ 2
Помимо упомянутых выше междоменных проблем, responseXML
требует полностью корректного XML и, вероятно, правильного Content-Type
в заголовках ответов, отправленных с сервера. Очень маловероятно, что любой из этих требований будет удовлетворен средним веб-сайтом.
Для последней проблемы вы можете использовать
xmlhttp.overrideMimeType('application/xml');
перед отправкой запроса, чтобы заставить ответ взаимодействовать как XML. Тем не менее, если ответ недействителен XML, вы получите только null
.
Ответ 3
Если я правильно помню, это известная проблема с firefox (раньше у меня была такая же проблема).
Исправление состоит в том, чтобы проанализировать responseText в документе XML, а затем использовать это.
Что-то вроде этого:
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlhttp.responseText, "application/xml");
Ответ 4
Попробуйте открыть значение url
непосредственно в браузере. Вы должны получить информацию об ошибке.
Если вы видите ошибку синтаксического анализа, вероятность того, что ваша кодировка неверна, и у вас есть специальный символ в вашем XML, что делает его недействительным.
Чтобы этого избежать, вы должны быть уверены, что вся цепочка правильно закодирована.
Если это статический XML файл, вам нужно правильно настроить кодировку редактора при ее сохранении. Кодировка, которая делает все это (почти), это UTF-8, обычно это свойство, которое вы можете выбрать в настройках вашего редактора или в диалоговом окне сохранения.
Если он динамически генерируется. Ваши данные, страница и ответ сервера должны быть правильно закодированы. И ваш XML, начинающийся с <?xml version="1.0" encoding="UTF-8"?>
Вы можете попробовать сначала с очень простым и статическим XML:
<?xml version="1.0" encoding="UTF-8"?><root>hi</root>
Затем добавьте шаги, один за другим, чтобы сделать их похожими на ваши, не нарушая его.
Ответ 5
Обманывал это часами и, наконец, выяснил тупую небольшую ошибку, которая меня испортила...
Если вы похожи на меня, вам нравится сохранять код JavaScript во внешнем файле .js.
Поэтому использование xmlhttp.open( "GET", "yourxmlfile.xml", false) всегда будет искать XML файл RELATIVE для документа HTML, даже если код находится во внешнем Файл JavaScript.
Если responseText возвращает null, локальный файл не может быть найден в указанном местоположении пути.
И если для async установлено значение true, файл будет создан, и текст ответа будет содержать содержимое пустого XML-документа.
Пример:
xmlDoc = xmlhttp.responseText;//Тип данных String
or
xmlDoc = xmlhttp.responseXML;//Тип данных XML
- folder1 = folder2, index.html.
- folder2 = index.js, yourxmlfile.xml.
- путь к XML из HTML = "folder2/yourxmlfile.xml", а не "yourxmlfile.xml".
И не забудьте проанализировать XML-документ в "text/xml" после открытия и перед отправкой запроса.
Пример:
- xhttp.overrideMimeType( 'текст/XML');
- Chrome: xmlDoc = (новый DOMParser()). parseFromString (xmlDoc, "text/xml" );
Ответ 6
Для меня это была простая проблема. В моем файле xml/php произошла синтаксическая ошибка.
Когда я просмотрел файл в своем браузере, браузер не обнаружил никаких ошибок.
Убедитесь, что элементы в вашем XML-документе правильно закрыты!
Ответ 7
Поврежденный XML любого рода вызовет эту проблему. Например, у меня был атрибут renderer
(без ="something"
), который является недопустимым и вызывает DOMParser
-, который вызывается XMLHTTPRequest
- для подавления. Следовательно, событие load
будет содержать текстовый ответ, но не XML.