2011-11-29 18 views
5

jQuery'yi kullanarak bir xml yanıtı ayrıştırmaya çalışıyorum ve sadece bir öğeyi bir sayfa çıktıyorum ancak bu konuda başarısız oldum.jQuery Kullanarak XML Yanıtı Nasıl Ayrılır

Yanıtın & ayrıştırma için kullanıyorum kod aşağıdadır.

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

ben "back1 Came" için uyarıları alıyorum ama başka gitmeden gibi görünen etmez. Aşağıda, yukarıdaki jquery kodumu kullanarak ayrıştırmaya çalışıyorum XML Yanıtı. Ben sonuçta yanıt dışına dönmeye çalışıyorum metin Benim soru nasıl verileri düzgün ayrıştırmak olduğunu bu elemanın

<?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> 

var? Kod sözdiziminin doğru olduğuna inanıyorum ancak beklenen sonuçları almıyorum. Herhangi bir yardım için minnettarım, teşekkürler. "Ben sadece uyarı mesajı çalıştırdığınızda

$.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"; 

    }); 
}); 

}

i is back alırsınız:

DÜZENLEME

Ben öneriyi beğendi aşağıdaki için kodumu değiştirdik, ancak hala şans Geri döndü1 "yani kod hala jquery ile düzgün şekilde xml geçmiyor demektir. Başka önerileriniz var mı?

+0

Tek bir ns0: CI örneğini eşleştirmeye mi çalışıyorsunuz, yoksa birden çok kez görünebilir mi? – JesseBuesking

+0

Burada da gönderdiğim XML yanıtında görebileceğiniz gibi yalnızca bir tane ns0: CI örneği döndürülüyor. – user1013396

cevap

2

ad kapsamına sahip isimler biraz farklı ele alınması gerekir olacaktır. Bu cevaba göre: jQuery XML parsing with namespaces bunun yerine bir öznitelik seçicisi [@ nodeName = tns: CIs] kullanmanız gerekir.

jQuery sürümleri için "@" öğesini 1,3'ten sonra bırakmanız gerekebilir. Başka bir öneri de kolondan kaçmaktır: .find ('tns \: CIs'), sözdizimsel öneki anlamsal ad alanı (uri) ile birleştirdiği için hacky. Yani önek değiştiyse bu yöntem kırılırdı. Daha doğru bir cevap, önekin ad alanı uri'ya eşlenmesini tanıyacaktır. jquery-xmlns plugin for namespace-aware selectors bu açıdan umut verici görünüyor.

+0

Bu işe yaradı! Çok teşekkürler! – user1013396

+0

Aslında sorun yaşıyorum, bu Firefox'ta çalışıyor, ancak IE 8 değil (Burada kullanılan şey). – user1013396

+1

JQuery'deki bir hata olduğunu söyleyebilirim: http://bugs.jquery.com/ticket/155 – jerseyboy

1

jQuery başarı işleviniz yanlış formdadır. Bu sizin $.ajax işlevinde, formun yanı sıra

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

arasında olması gerekir, bunun yerine (sunucuya XML gönderiyoruz varsayarak) önce var ne contentType: "text/xml" olmak contentType hattını değiştirin.

Daha fazla bilgi için jQuery.ajax() documentation konusuna bakın.

+0

find, ad alanlarıyla çalışmaz. – Christophe

0

Muhtemelen şu sözdizimi

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

Bu, jQuery 1.7'de çalışmaz. – Christophe

1

Yorumunuza dayanarak, neden jQuery ile bir şeyler yapıyorsunuz? Sadece javascript'i kullan!

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

İşte eylem gösteren bir jsfiddle bu.

+1

Bu özel örnekle çalışır, ancak düğümün özellikleri varsa kesilir. – Christophe