views:

4544

answers:

4

Saw this example on the jQuery examples page for Ajax:

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

How do I take a string like:

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

And convert that to a XML DOM object? cross-browser?

UPDATE: Please see comments to karim79's answer.

+12  A: 

Wrap it in a jQuery object. Then use normal DOM methods on it.

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

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

If you want to convert it back to a plain string (after modifying it for example) you can do it like so:

//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: The $.ajax manual says (on the processData option):

By default, data passed in to the data option as an object (technically, anything other than a string) will be processed and transformed into a query string, fitting to the default content-type "application/x-www-form-urlencoded". If you want to send DOMDocuments, or other non-processed data, set this option to false.

So if you're passing a jQuery object to the server, you'll need to set that to true, or omit it altogether (it is set to true by default). Hope that helped.

karim79
Maybe I'm getting something wrong in the $.ajax call. I did wrap it like you said. Then my log on the server shows I'm passing in: [object Object]What should I try now?
tyndall
Am I doing something wrong with .ajax() ? I just passed it as a string and it worked. weird. Does this have something to do with the processData option? or another option I'm not turning on?
tyndall
+1 thanks for these examples
tyndall
@Tyndall - see my edit. Basically, if you're passing an XML string to the server, the setting you currently have is correct (processData : false. If you pass the jQuery object, you'll need to either get rid of that option or set it to true.
karim79
Thanks for the explanation of the processData - "jQuery in Action" didn't explain as well as you did in 4 sentences.
tyndall
@Tyndall - Cheers, glad that solved your problem!
karim79
+1  A: 

Just a heads up on calling find - if it's a top level element you need to use filter instead.

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

//loop over 'foo' nodes
t.filter('foo').each(function () {
  alert($(this).find('bar').text());
});
Andy Gaskell
@pubb - you are right, I skipped over that detail as I always loop over the second-level elements. +1 for pointing it out.
karim79
A: 

This solution does not work in IE6 can anyone suggest a workaround?

Paul
A: 

Convert XML to HTML see here http://java.pakcarid.com/Cpp.aspx?sub=418&amp;ff=3275&amp;topid=40&amp;sls=25

lois