XML, Javascript — невозможно вызвать метод getElementsByTagName со значением null

Я работаю над небольшой идеей веб-сайта, и я не очень хорош во всем этом. По сути, у меня есть HTML-викторина, которая будет предлагать пользователю вопросы, которые я определил в XML.

window.onload = function xml() 
{
    // get form from HTML
    var form = document.getElementById("form");

    // get XML document
    if (window.XMLHttpRequest)
    {
            var xmlhttp = new XMLHttpRequest();
    }

    // open XML
    xmlhttp.open("GET", "questions.xml", false);
    xmlhttp.send(null);

    // initialize elements for do document, questions, and details
    var xmlDoc = xmlhttp.responseXML;
    var question = xmlDoc.getElementsByTagName("question");

В строке выше я получаю сообщение об ошибке «Невозможно вызвать метод getElementsByTagName со значением null». Странная вещь, однако, заключается в том, что я получаю указанную ошибку только в том случае, если файл XML имеет несколько тегов «вопрос». Если в моем XML есть только один тег «вопрос», вся функция работает отлично. Поэтому мне интересно, что происходит в этом случае, и почему это не сработает для меня.

(остальная часть кода ниже показывает, где я начинаю работать с функцией)

    var qXML = xmlDoc.getElementsByTagName("q");

    // write values into HTML for each question
    for ( i = 0 ; i < question.length ; i++ )
    {
        // qBlock div for question
        var div = document.createElement('div');
        div.className = "qBlock";

Этот код продолжает некоторое время, чтобы получить все поля в HTML. В целом, этот блок кода в цикле работает на всем протяжении, если нет нескольких элементов «вопрос».

Большое спасибо всем, кто может помочь / научить меня чему-либо из этого. Также не стесняйтесь сказать мне, если я делаю что-то еще неправильно. Я открыт для любой критики.


person mvarble    schedule 10.06.2013    source источник
comment
Как выглядит ваш файл questions.xml?   -  person icktoofay    schedule 10.06.2013
comment
Он сообщает вам, что xmlDoc имеет значение null, которое возвращается, если запрос не завершен или не выполнен успешно. Проверьте ответ перед вызовом getElementsByTagName. Код в остальной части кода выглядит раздробленным, он использует тег q, назначает qXML, затем перебирает вопрос.   -  person RobG    schedule 10.06.2013


Ответы (1)


Хотя я не могу быть уверен, что это проблема, не видя ваш файл questions.xml, у вас может быть несколько корневых элементов. Например:

<?xml version="1.0"?>
<question>...</question>
<question>...</question>

XML этого не позволяет, и он не сможет выполнить синтаксический анализ. Оберните их в один корневой элемент:

<?xml version="1.0"?>
<questions>
    <question>...</question>
    <question>...</question>
</questions>
person icktoofay    schedule 10.06.2013
comment
Большое спасибо. Не могу поверить, что вы ответили на этот вопрос, даже не увидев мой XML. Извините, что забыл показать это, и еще раз спасибо за вашу помощь. Ты великолепен. - person mvarble; 10.06.2013