В какой момент жизни объекта xmlHttpRequest сериализованный XML анализируется в DOM? - PullRequest
2 голосов
/ 28 февраля 2009

В JavaScript xmlHttpRequest.responseXML() возвращает объект DOM Document. DOM Document объект создан из тела HTTP-ответа HTTP.

В какой момент при жизни объекта xmlHttpRequest строка XML анализируется в DOM Document?

Я могу представить, что это может произойти в одном из двух мест.

  • Когда вызывается responseXML().
    Нет необходимости тратить ресурсы на разбор XML-строки в DOM, пока вы не узнаете, что это действительно нужно.

  • Когда получен ответ HTTP.
    Если сервер возвращает текстовый / xml-тип содержимого, ясно, что вы запросили XML, и вы, вероятно, захотите, чтобы тело ответа было проанализировано в DOM, поскольку в противном случае вы ничего не сможете сделать с запрошенными данными.

Обе опции имеют свои достоинства, хотя я склонен сказать, что строка XML анализируется только при вызове responseXML.

В какой момент происходит синтаксический анализ строки XML?

Причины для запроса: мне нужно измерить производительность десериализации XML на основе браузера, чтобы сравнить ее с производительностью десериализации JSON.

Ответы [ 3 ]

1 голос
/ 28 февраля 2009

Было бы очень логично анализировать поток как полученный. Ожидание завершения ответа (или вызова свойства responseXml) означает дополнительную задержку между получением последних байтов и построением DOM. Казалось бы, лучшим подходом было бы построить DOM параллельно с получением потока, следовательно, по завершении DOM готов к использованию.

Обратите внимание, что большая подсказка заключается в том, что MSXML не предоставляет DOM, если тип Content не определяет тип XML, а реализация Mozilla позволяет ему обрабатывать полученный контент, как если бы он был XML Content-Type, указывающий иначе.

Ничего из вышеперечисленного не требуется, если DOM не анализируется до получения доступа к свойству. Свойство может также просто попытаться разобрать. Это потому, что DOM может быть создан при получении контента, что необходимо выше.

1 голос
/ 25 марта 2011

Для Chrome DOM создается и анализируется при вызове responseXML ().

Вот источник для метода:

Document* XMLHttpRequest::responseXML(ExceptionCode& ec)
{
    if (responseTypeCode() != ResponseTypeDefault && responseTypeCode() != ResponseTypeText && responseTypeCode() != ResponseTypeDocument) {
        ec = INVALID_STATE_ERR;
        return 0;
    }

    if (m_state != DONE)
        return 0;

    if (!m_createdDocument) {
        if ((m_response.isHTTP() && !responseIsXML()) || scriptExecutionContext()->isWorkerContext()) {
            // The W3C spec requires this.
            m_responseXML = 0;
        } else {
            m_responseXML = Document::create(0, m_url);
            // FIXME: Set Last-Modified.
            m_responseXML->setContent(m_responseBuilder.toStringPreserveCapacity());
            m_responseXML->setSecurityOrigin(document()->securityOrigin());
            if (!m_responseXML->wellFormed())
                m_responseXML = 0;
        }
        m_createdDocument = true;
    }

    return m_responseXML.get();
}
1 голос
/ 28 февраля 2009

Я не удивлюсь, если это зависит от браузера. Почему бы не профилировать все три?

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