2011-11-29 9 views
5

jQueryを使用してXMLレスポンスを解析しようとしていますが、ページの要素を出力するだけですが、これではうまくいかないです。jQueryを使用してXMLレスポンスを解析する方法

以下は、私が応答を&の解析に使用しているコードです。

$.ajax({ 
    url: UCMDBServiceUrl, 
    type: "POST", 
    dataType: "xml", 
    data: soapMessage, 
    success: UCMDBData, 
    crossDomain: true, 
    contentType: "text/xml; charset=\"utf-8\"" 
}); 
alert("Sent2"); 
return false; 
} 

function UCMDBData(xmlHttpRequest, status, msg) 
{ 
    alert("Came back1"); 
    $(xmlHttpRequest.responseXML).find('tns:CIs').each(function() 
    { 
     alert("Came back2"); 
     $(this).find("ns0:CI").each(function() 
     { 
      alert("Came back3"); 
      $("#output").append($(this).find("ns0:ID").text()); 
     }); 
    });  
} 

「Came back1」のアラートを受信して​​いますが、これ以上進まないようです。以下は、上記のjqueryコードを使用して解析しようとしているXML Responseです。私は最終的に応答の外に返すようにしようとしていますテキストは、この要素に

<?xml version='1.0' encoding='utf-8'?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header /> 
    <soapenv:Body> 
     <tns:getFilteredCIsByTypeResponse xmlns:ns0="http://schemas.hp.com/ucmdb/1/types" xmlns:ns1="http://schemas.hp.com/ucmdb/ui/1/types" xmlns:ns2="http://schemas.hp.com/ucmdb/1/types/query" xmlns:ns3="http://schemas.hp.com/ucmdb/1/types/props" xmlns:ns4="http://schemas.hp.com/ucmdb/1/types/classmodel" xmlns:ns5="http://schemas.hp.com/ucmdb/1/types/impact" xmlns:ns6="http://schemas.hp.com/ucmdb/1/types/update" xmlns:ns7="http://schemas.hp.com/ucmdb/discovery/1/types" xmlns:ns8="http://schemas.hp.com/ucmdb/1/types/history" xmlns:tns="http://schemas.hp.com/ucmdb/1/params/query"> 
      <tns:CIs> 
       <ns0:CI> 
        <ns0:ID>4d030502995a00afd989d3aeca2c990c</ns0:ID> 
        <ns0:type>nt</ns0:type> 
        <ns0:props> 
         <ns0:strProps> 
          <ns0:strProp> 
           <ns0:name>name</ns0:name> 
           <ns0:value>prodoo</ns0:value> 
          </ns0:strProp> 
         </ns0:strProps> 
         <ns0:booleanProps> 
          <ns0:booleanProp> 
           <ns0:name>host_iscomplete</ns0:name> 
           <ns0:value>false</ns0:value> 
          </ns0:booleanProp> 
         </ns0:booleanProps> 
        </ns0:props> 
       </ns0:CI> 
      </tns:CIs> 
      <tns:chunkInfo> 
       <ns0:numberOfChunks>0</ns0:numberOfChunks> 
       <ns0:chunksKey> 
        <ns0:key1 /> 
        <ns0:key2 /> 
       </ns0:chunksKey> 
      </tns:chunkInfo> 
     </tns:getFilteredCIsByTypeResponse> 
    </soapenv:Body> 
</soapenv:Envelope> 

あるだから私の質問は、どのように私はデータを正しく解析しないということですか?私は、コードの構文が正しいと思うが、私は期待される返された結果を得ていない。助けていただければ幸いです。

EDIT

私は提案のように、以下に私のコードを変更したが、まだ運:「

$.ajax({ 
    url: UCMDBServiceUrl, 
    type: "POST", 
    dataType: "xml", 
    data: soapMessage, 
    success: UCMDBData, 
    crossDomain: true, 
    contentType: "text/xml;" 
    }); 
alert("Sent2"); 
return false; 
} 

function UCMDBData(data, textStatus, jqXHR) { 
    alert("Came back1"); 
    $(data).find('tns:CIs').each(function() { 
     alert("Came back2"); 
     $(this).find("ns0:CI").each(function() { 
      alert("Came back3"); 
      $("#output").append($(this).find("ns0:ID").text()); 
      document.AppServerForm.outputtext.value = document.AppServerForm.outputtext.value + "http://localhost:8080/ucmdb/cms/directAppletLogin.do?objectId=" + $(this).find('ns0:ID').text() +"&infopane=VISIBLE&navigation=true&cmd=ShowRelatedCIs&interfaceVersion=8.0.0&ApplicationMode=ITU&customerID=1&userName=admin&userPassword=admin"; 

    }); 
}); 

}

私は私が戻って受け取るだけの警告メッセージを実行しない場合Came back1 "は、コードがまだjqueryでxmlを正しく処理していないことを意味します。その他の提案はありますか?

+0

あなたはNS0の単一のインスタンスと一致するようにしようとしています:CIを、またはそれが複数回出現することができますか? – JesseBuesking

+0

ここに投稿したXMLレスポンスでわかるように、ns0:CIのインスタンスは1つだけ返されます。 – user1013396

答えて

2

だろう。この回答によると: jQuery XML parsing with namespaces 代わりに属性セレクタ[@ nodeName = tns:CIs]を使用する必要があります。

jQueryバージョン1.3以降では、「@」を削除する必要があります。別の提案は、コロン:.find( 'tns \:CIs')をエスケープすることです。これは構文上の接頭辞をセマンティックな名前空間(uri)と組み合わせるためにハッキーです。プレフィックスが変更された場合、このメソッドは中断します。より正確な答えは、接頭辞と名前空間URIとのマッピングを認識します。 jquery-xmlns plugin for namespace-aware selectorsはその点で有望です。

+0

これはうまくいきました!本当にありがとう! – user1013396

+0

実際に私はまだ問題を抱えていますが、これはFirefoxでは動作しますが、IE 8では動作しません(これはここで使用されているものです)。 – user1013396

+1

JQueryのバグだと分かります。http://bugs.jquery.com/ticket/155 – jerseyboy

1

jQueryの成功関数の形式が間違っています。それはまた、フォーム

function UCMDBData(data, textStatus, jqXHR) { 
    alert("Came back1"); 
    $(data).find('tns:CIs').each(function() { 
     alert("Came back2"); 
     $(this).find("ns0:CI").each(function() { 
      alert("Came back3"); 
      $("#output").append($(this).find("ns0:ID").text()); 
     }); 
    }); 
} 

であることが必要である、あなたの$.ajax機能では、代わりに、あなたは(あなたがサーバーにXMLを送信していると仮定して)前に持っているもののcontentType: "text/xml"するcontentType行を変更します。

詳細については、jQuery.ajax() documentationを参照してください。

+0

findは名前空間では動作しません。 – Christophe

0

おそらく正しい構文は、名前空間スコープの名前が少し異なる処理する必要があり

success: function(xml) { 
    $(xml).find('tns:CIs').each(function() { 
    ...... 
+0

これはjQuery 1.7で動作しません – Christophe

1

あなたのコメントに基づいて、何かjQueryに夢中になるのはなぜですか?ちょうどjavascript自体を使用してください!

var open = '<ns0:ID>'; 
var close = '</ns0:ID>'; 

var start = obj.indexOf(open) + open.length; 
var end = obj.indexOf(close); 

var result = obj.slice(start, end); 

は、ここでのアクションでそれを示してjsfiddleです。

+1

この具体例では動作しますが、ノードに属性がある場合は破損します。 – Christophe

関連する問題