responseXML всегда нулевой - PullRequest
       12

responseXML всегда нулевой

16 голосов
/ 23 сентября 2010

Я использую 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, я сделал его таким же источником, что и запрошенный URL. Также я попытался выполнить с консоли firebug, снова обеспечивая политику происхождения. Одна и та же ошибка на обоих.
Должен ненавидеть Javascript.

Ответы [ 8 ]

23 голосов
/ 23 сентября 2010

Помимо уже упомянутых междоменных проблем, responseXML требует полностью допустимого XML и, возможно, правильного Content-Type в заголовках ответов, отправленных с сервера.Весьма маловероятно, что какое-либо из этих требований будет выполнено средним веб-сайтом.

Для последнего вопроса вы можете использовать

xmlhttp.overrideMimeType('application/xml');

перед отправкой запроса для принудительного ответа набыть интерпретирован как XML.Тем не менее, если ответ не является допустимым XML, вы получите только null.

19 голосов
/ 23 сентября 2010

Если я правильно помню, это известная проблема с Firefox (раньше у меня была такая же проблема).

Исправление состоит в том, чтобы проанализировать responseText обратно в документ XML, а затем использовать его.

Примерно так:

var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlhttp.responseText, "application/xml");
8 голосов
/ 23 сентября 2010

Могу поспорить, что вы нарушаете ту же политику происхождения.

Для XHR у вас должен быть тот же протокол, домен, порт и т. Д. Поэтому, если вы запускаете приложение на localhost: 8080 / app,НЕ МОЖЕТ ajax к www.cnn.com.

Различные браузеры обрабатывают это по-разному;Я видел, как FF делает то, что вы описываете, то есть запрос, кажется, возвращает нормально, но нет данных ...

5 голосов
/ 24 сентября 2010

Попробуйте открыть значение url прямо в браузере. Вы должны получить некоторую информацию об ошибке.
Если вы видите ошибку синтаксического анализа, скорее всего, ваша кодировка неверна, и у вас есть специальный символ в XML, который делает его недействительным.

Чтобы избежать этого, вы должны быть уверены, что вся цепочка правильно закодирована.

Если это статический файл XML, вам необходимо правильно указать кодировку вашего редактора при его сохранении. Кодировка, которая делает все это (почти), - UTF-8, обычно это свойство, которое вы можете выбрать в настройках редактора или в диалоговом окне сохранения.

Если он генерируется динамически. Ваши данные, страница и ответ сервера также должны быть правильно закодированы. И ваш XML начинается с <?xml version="1.0" encoding="UTF-8"?>

Вы можете попробовать сначала с очень простым и статичным XML:

<?xml version="1.0" encoding="UTF-8"?><root>hi</root>

А затем добавьте шаги, один за другим, чтобы сделать его похожим на ваш, не нарушая его.

1 голос
/ 24 мая 2013

Дурачилась с этим часами и, наконец, поняла глупую маленькую ошибку, которая меня напутала ...

Если вы похожи на меня, вы хотите сохранить свой код JavaScript во внешнем файле ".js".

Поэтому при использовании xmlhttp.open ("GET", "yourxmlfile.xml", false) всегда будет выполняться поиск XML-файла ОТНОСИТЕЛЬНО HTML-документа , даже если код находится во внешнем JavaScript файл.

Если responseText возвращает ноль, локальный файл не может быть найден в указанном месте пути. И если для async задано значение true, файл будет создан, а текст ответа будет содержать содержимое пустого XML-документа.

Пример:

xmlDoc = xmlhttp.responseText; // Строковый тип данных

        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");
0 голосов
/ 16 декабря 2018

Мне было трудно найти правильный пример XML.Если вы получаете ноль, попробуйте валидатор XML.Для меня элемент <root> отсутствовал.

<root>
<info><p>Array
(
)
</p>
</info>
<itemData>{"id":"40","client_id":"1","nameUnique":"Lore ipsum","description":null,"userComment":null,"last_modified":"2018-12-15 02:48:57"}    </itemData>
</root>
0 голосов
/ 12 апреля 2016

Искаженный XML любого типа вызовет эту проблему. Например, у меня был атрибут renderer (без ="something"), который недопустим и заставляет DOMParser - который вызывается XMLHTTPRequest - задыхаться Следовательно, событие load будет содержать текстовый ответ, но не XML.

0 голосов
/ 23 сентября 2013

Для меня это была простая проблема.В моем файле xml / php произошла синтаксическая ошибка.Когда я просматривал файл в своем браузере, браузер не обнаружил никаких ошибок.

Убедитесь, что элементы в вашем XML-документе правильно закрыты!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...