2009-08-17 18 views
20

Saw questo esempio nella pagina di esempi jQuery per l'Ajax:Converti stringa di documento XML in JavaScript

var xmlDocument = [create xml document]; 
$.ajax({ 
     url: "page.php", 
     processData: false, 
     data: xmlDocument, 
     success: someFunction 
    }); 

Come faccio a prendere una stringa del tipo:

var t = '<foo><bar>something</bar></foo>'; 

e convertire che a un DOM XML oggetto? cross-browser?

UPDATE: Vedere i commenti alla risposta di karim79.

risposta

35

Avvolgere in un oggetto jQuery. Quindi usa i normali metodi di manipolazione DOM di jQuery su di esso.

var t = $('<foo><bar>something</bar></foo>'); 

//loop over 'bar' nodes 
t.find('bar').each(function() { 
    alert($(this).text()); 
}); 

Se si desidera convertire in una stringa normale (dopo averlo modificato per esempio) si può fare in questo modo:

//then convert it back to a string 
//for IE 
if (window.ActiveXObject) { 
    var str = t.xml; 
    alert(str); 
} 
// code for Mozilla, Firefox, Opera, etc. 
else { 
    var str = (new XMLSerializer()).serializeToString(t); 
    alert(str); 
} 

EDIT: La $.ajax manual says (sull'opzione processData):

per default, dati passati ai dati opzione come un oggetto (tecnicamente, altro che una stringa) saranno elaborati e trasformato in una stringa di query , adattandosi al valore predefinito tipo di contenuto "application/x-www-form-urlencoded". Se si desidera inviare DOMDocuments o altri dati non elaborati, impostare l'opzione su false.

Quindi, se stai passando un oggetto jQuery per il server, è necessario impostare che a vero, o omettere del tutto (è impostata su true per impostazione predefinita). Spero che questo abbia aiutato.

+0

Forse sto ricevendo qualcosa di sbagliato nella chiamata $ .ajax. L'ho avvolto come hai detto tu. Quindi il mio registro sul server mostra che sto passando: [oggetto oggetto] Cosa dovrei provare ora? – BuddyJoe

+0

Sto facendo qualcosa di sbagliato con .ajax()? L'ho appena passato come una stringa e ha funzionato. strano. Questo ha qualcosa a che fare con l'opzione processData? o un'altra opzione che non sto accendendo? – BuddyJoe

+0

+1 grazie per questi esempi – BuddyJoe

10

Solo un avviso su come chiamare find: se si tratta di un elemento di livello superiore, è necessario utilizzare il filtro.

var t = $('<foo><bar>something</bar></foo>'); 

//loop over 'foo' nodes 
t.filter('foo').each(function() { 
    alert($(this).find('bar').text()); 
}); 
+0

@pubb: hai ragione, ho saltato quel dettaglio mentre cerco sempre gli elementi di secondo livello. +1 per indicarlo. – karim79

0

è possibile utilizzare questo semplice codice per convertire i tag XML al testo

var temp_var = $("<p/>").append($(your_xml_data)).htML() 
0

roccia solida codice. funziona perfettamente su tutti i browser.

var xmlFields = $("<root><reports name='report 1'><item 
       field='ord_num' desc='Order Number'/></reports></root>"); 
alert(xmlFields[0].outerHTML); 
+0

Funziona solo perché jQuery ha creato nodi HTML per questi. Per qualcosa in cui jQuery le tratta come nodi XML (come '$ ($ .parseXML (" ")'), questo non funzionerà. – ZiggyTheHamster

0

È possibile eseguire la conversione senza jQuery. Questo è preso da Mozilla DOMParser Documentation:

// Create a DOMParser 
var parser = new DOMParser(); 

// Use it to turn your xmlString into an XMLDocument 
var xmlDoc = parser.parseFromString(xmlString, "application/xml");