2011-11-29 11 views
5

Sto tentando di analizzare una risposta xml utilizzando jQuery e appena restituito un elemento di una pagina, ma non ci riesco.Come analizzare la risposta XML utilizzando jQuery

Di seguito è il codice che sto usando per la risposta & parsing di esso.

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

sto ricevendo gli avvisi per "Came back1" ma doesnt sembrano essere andare oltre. Di seguito è la risposta XML che sto cercando di analizzare utilizzando il mio codice jquery sopra. Il testo che sto in ultima analisi, cercando di tornare fuori la risposta è in questo elemento

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

Quindi la mia domanda è che come faccio analizzare correttamente i dati? Credo che la sintassi del codice sia corretta ma non ottengo i risultati attesi. Gradirei qualsiasi aiuto, grazie.

EDIT

ho modificato il mio codice al seguente come il suggerimento, ma ancora senza fortuna:

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

    }); 
}); 

}

Quando eseguo l'unico messaggio di avviso che riceverà indietro è " Came back1 "che significa che il codice non sta ancora attraversando l'xml correttamente con jquery. Qualche altro suggerimento?

+0

Si sta tentando di abbinare una singola istanza di ns0: CI o può apparire più di una volta? – JesseBuesking

+0

Esiste solo una singola istanza di ns0: CI che viene restituito come si può vedere nella risposta XML che ho postato anche qui.La ricerca – user1013396

risposta

2

I nomi dello spazio dei nomi con ambito devono essere trattati un po 'diverso. In base a questa risposta: jQuery XML parsing with namespaces è necessario utilizzare un selettore di attributo [@ nodeName = tns: CIs].

Potrebbe essere necessario eliminare "@" per le versioni jQuery successive alla 1.3. Un altro suggerimento è quello di sfuggire ai due punti: .find ('tns \: CIs'), che è hacky perché confonde il prefisso sintattico con lo spazio dei nomi semantico (l'uri). Quindi se il prefisso cambiato questo metodo si romperebbe. Una risposta più corretta riconoscerà la mappatura del prefisso allo spazio dei nomi uri. Il jquery-xmlns plugin for namespace-aware selectors sembra promettente in questo senso.

+0

Questo ha funzionato! Grazie mille! – user1013396

+0

In realtà sto ancora avendo problemi, questo funziona su Firefox, ma non su IE 8 (che è ciò che viene usato qui). – user1013396

+1

Quasi come posso dire è un bug in JQuery: http://bugs.jquery.com/ticket/155 – jerseyboy

1

La tua funzione di successo jQuery è nella forma sbagliata. Ha bisogno di essere della forma

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

Inoltre, nella funzione $.ajax, modificare la riga contentType essere contentType: "text/xml" invece di quello che hai davanti (supponendo che si sta inviando XML al server).

Vedere jQuery.ajax() documentation per ulteriori informazioni.

+0

non funziona con gli spazi dei nomi. – Christophe

0

Probabilmente la sintassi giusta sarebbe

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

Questo non funziona in jQuery 1.7 – Christophe

1

Sulla base del tuo commento, perché fare qualcosa di pazzo con jQuery? Basta usare javascript stesso!

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

Ecco un jsfiddle che lo mostra in azione.

+1

Funziona con questo specifico esempio, ma si interromperà se il nodo ha attributi. – Christophe

Problemi correlati