2009-02-28 7 views
2

JavaScriptでxmlHttpRequest.responseXML()DOM Documentオブジェクトを返します。 DOM Documentオブジェクトは、XML構造のHTTP応答本体から作成されます。xmlHttpRequestオブジェクトのライフサイクルのどの時点で、シリアル化されたXMLがDOMに解析されますか?

xmlHttpRequestオブジェクトのライフサイクルのどの時点で、DOM Documentに解析されたXML文字列はありますか?

私は2つの場所のいずれかに発生する可能性が想像することができます。

  • responseXML()が呼び出されたとき。
    実際に必要であることがわかるまで、XML文字列をDOMに解析するリソースを無駄にする必要はありません。

  • HTTP応答を受信したとき。
    サーバーがtext/xmlコンテンツタイプを返す場合は、XMLを要求していることは明らかです。そうでなければ、要求されたデータをあまり使わないので、レスポンスボディをDOMに解析してほしいでしょう。
  • どちらのオプションにもメリットがありますが、XML文字列はresponseXMLが呼び出されたときにのみ解析されると言われています。

    どの時点でXML文字列の解析が行われますか?

    質問:JSONのデシリアライズのパフォーマンスと比較するために、ブラウザベースのXMLデシリアライズのパフォーマンスを測定する必要があります。

    答えて

    1

    ストリームが受信されたときに解析されるのは非常に意味があります。レスポンスが完了するまで待つか(またはresponseXmlプロパティが呼び出される)、最後のバイトを受け取ると構築されるDOMの間に余分な遅延が導入されます。ストリームを受け取ると並行してDOMを構築する方が良い方法だと思われます。したがって、DOMの使用準備が整いました。

    コンテンツタイプでXMLタイプが指定されておらず、Mozillaの実装では受信したコンテンツをXMLのように扱うように指示することができる場合、MSXMLはDOMを提供しないという大きな手掛かりがありますそうでなければContent-Typeにもかかわらず。

    プロパティにアクセスするまでDOMが解析されない場合は、上記のいずれも必要ありません。このプロパティは、単に構文解析を試みることもできます。その理由は、上記が必要とされるコンテンツが受信されるとDOMが構築されるからです。

    1

    これはブラウザに依存していると私は驚くことはありません。なぜ3つすべてをプロファイリングしないのですか?

    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(); 
    } 
    
    関連する問題