responseXML является нулем - PullRequest
       0

responseXML является нулем

2 голосов
/ 07 августа 2011
url = "http://localhost/xml.php?type=xml";
if (window.XMLHttpRequest) {
      xmlhttp = new XMLHttpRequest();
      xmlhttp.open("GET", url, true);
      xmlhttp.setRequestHeader('Content-Type', 'application/xml');
      xmlhttp.send(null);
}
else if (window.ActiveXObject)  {
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    if (xmlhttp) {
        xmlhttp.open("GET", url, true);
        xmlhttp.setRequestHeader('Content-Type', 'application/xml');
        xmlhttp.send();
    }
}

alert(xmlhttp.responseXML); //returns null

XML-файл

<?xml version="1.0" encoding="UTF-8" ?>
<main>
    <food>
        <type>6</type>
        <region>5676</region>
    </food>
    <food>
        <type>6</type>
        <region>5676</region>
    </food>

</main>

Кто-нибудь знает, почему xmlhttp.responseXML возвращается как ноль?

Ответы [ 4 ]

4 голосов
/ 07 августа 2011

Ваш HTTP-запрос асинхронный. xmlhttp.responseXML не будет иметь какое-либо значение, пока xmlhttp.readyState не будет иметь значение 4.

var url = "http://localhost/xml.php?type=xml";
var xmlhttp;
if (window.XMLHttpRequest) {
      xmlhttp = new XMLHttpRequest();
}
else if (window.ActiveXObject)  {
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp) {
    xmlhttp.open("GET", url, true);
    xmlhttp.setRequestHeader('Content-Type', 'text/xml');
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4) {
            alert(xmlhttp.responseXML);
        }
    };
    xmlhttp.send();
}

Кроме того, я не думаю, что вам нужна строка setRequestHeader. Тип MIME XML требуется для ответа, а не для запроса. Также, пожалуйста, соблюдайте хорошие правила кодирования (не забудьте var, DRY и т. Д.)

3 голосов
/ 07 августа 2011

Убедитесь, что в вашем скрипте PHP есть header('Content-type: application/xml');. Дополнительно проверьте текст ответа - может быть, у вас ошибка?

1 голос
/ 16 апреля 2017

Недавно я перешел с Apache на nginx, и у меня возникла такая же проблема. Все отлично работало при загрузке в виде простых файлов или с сервера Apache, но responseXML всегда был нулевым при работе на nginx.

В моей конкретной ситуации также использовалась таблица стилей XSL для преобразования XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="main-template-transformer.xsl"?>

Тип содержимого обычного файла XML возвращался просто отлично. Однако значение имело тип содержимого файла XSL. (Это было обнаружено путем проверки responseText, который не был нулевым, и содержал весь текст файла XSL. Проверка заголовков HTTP в этом файле показала, что тип содержимого изменился между Apache и nginx.)

Тип содержимого должен быть text/xml или application/xml. Значение по умолчанию в nginx 1.10.3 - application/octet-stream, и это приведет к тому, что responseXML будет всегда нулевым.

Это можно исправить, добавив следующую строку в файл JavaScript:

xmlhttp.overrideMimeType('text/xml');

Это можно исправить, добавив следующую строку в конфигурацию сервера nginx в "conf / mime.types":

    text/xml                              xsl;
0 голосов
/ 14 мая 2015

Я только что проверил и нашел решение.

Я не знаю почему, но когда вы отправляете заголовок xml, XMLHttpRequest не способен его проанализировать.

Для использования свойств DOM responseXML XMLHttpRequest необходимо удалить заголовок xml.

В вашем случае ответ xml будет

<main>
    <food>
        <type>6</type>
        <region>5676</region>
    </food>
    <food>
        <type>6</type>
        <region>5676</region>
    </food>
</main>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...