2

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

xmlHttpRequest对象的生命周期中的什么时候将 XML 字符串解析为DOM Document?

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

  • 什么时候responseXML()调用。
    在您知道确实需要它之前,无需浪费资源将 XML 字符串解析为 DOM。

  • 收到 HTTP 响应时。
    如果服务器返回 text/xml 内容类型,那么很明显您已经请求了 XML,并且您可能希望将响应正文解析为 DOM,否则您无法对请求的数据做很多事情。

这两个选项都有一些优点,尽管我倾向于说 XML 字符串只有在responseXML被调用时才会被解析。

什么时候会解析 XML 字符串?

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

4

3 回答 3

1

如果这取决于浏览器,我不会感到惊讶。为什么不介绍所有三个?

于 2009-02-28T16:28:57.663 回答
1

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

请注意,如果 Content 类型未指定 XML 类型,则 MSXML 不提供 DOM,并且 Mozilla 的实现允许您告诉它将接收到的内容视为 XML,尽管 Content-Type另有说明。

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

于 2009-02-28T19:22:47.730 回答
1

对于 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();
}
于 2011-03-25T20:49:18.460 回答