Javascript xmlHttpRequest对象生命周期中的哪一点是序列化的XML解析为DOM?

Javascript xmlHttpRequest对象生命周期中的哪一点是序列化的XML解析为DOM?,javascript,ajax,dom,xmlhttprequest,Javascript,Ajax,Dom,Xmlhttprequest,在JavaScript中,xmlHttpRequest.responseXML()返回一个DOM文档对象。DOM文档对象是从XML结构的HTTP响应体创建的 在xmlHttpRequest对象的生命周期中,XML字符串在什么时候被解析到DOM文档中 我可以想象它可能发生在两个地方之一 调用responseXML()时。 在知道实际需要XML字符串之前,无需浪费资源将其解析为DOM。 当收到HTTP响应时。 如果服务器返回一个text/xml内容类型,很明显您已经请求了xml,并且您可能希望将响

在JavaScript中,
xmlHttpRequest.responseXML()
返回一个
DOM文档
对象。
DOM文档
对象是从XML结构的HTTP响应体创建的

xmlHttpRequest
对象的生命周期中,XML字符串在什么时候被解析到
DOM文档中

我可以想象它可能发生在两个地方之一

  • 调用
    responseXML()
    时。
    在知道实际需要XML字符串之前,无需浪费资源将其解析为DOM。

  • 当收到HTTP响应时。
    如果服务器返回一个text/xml内容类型,很明显您已经请求了xml,并且您可能希望将响应主体解析为DOM,否则您无法处理请求的数据
这两个选项都有一些优点,尽管我倾向于说只有在调用
responseXML
时才会解析XML字符串

XML字符串的解析发生在什么时候


问的理由:我需要测量基于浏览器的XML反序列化性能,目的是将其与JSON反序列化性能进行比较。

如果这取决于浏览器,我不会感到惊讶。为什么不分析这三个呢?

将流解析为其接收的流将非常有意义。等待响应完成(或调用responseXml属性)意味着在接收最终字节和构建DOM之间会引入额外的延迟。似乎更好的方法是在接收流的同时构建DOM,因此完成后DOM就可以使用了

请注意,一个重要的线索是,如果内容类型没有指定XML类型,MSXML不提供DOM,并且Mozilla的实现允许您告诉它将接收到的内容视为XML,尽管内容类型另有指示


如果在访问属性之前不解析DOM,则上述两项都不是必需的。属性也可以简单地尝试解析。这是因为在接收内容时可能会构建DOM,所以上述内容是必需的。

对于Chrome,在调用responseXML()时会创建并解析DOM

以下是该方法的来源:

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();
}