Convert String to XML Document in JavaScript

54,112

Solution 1

Wrap it in a jQuery object. Then use jQuery's normal DOM manipulation 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.

Solution 2

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

Solution 3

You can do the conversion without jQuery. This is taken from Mozilla's 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");
Share:
54,112
BuddyJoe
Author by

BuddyJoe

I like to code C# and work with the web. Still learning.

Updated on February 07, 2020

Comments

  • BuddyJoe
    BuddyJoe over 4 years

    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.

  • BuddyJoe
    BuddyJoe over 14 years
    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?
  • BuddyJoe
    BuddyJoe over 14 years
    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?
  • karim79
    karim79 over 14 years
    @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.
  • BuddyJoe
    BuddyJoe over 14 years
    Thanks for the explanation of the processData - "jQuery in Action" didn't explain as well as you did in 4 sentences.
  • ken
    ken over 12 years
    Just a note that this fails in IE9 + quirks mode. Not a huge surprise, but something to be aware of at least.
  • Saravanan
    Saravanan about 12 years
    IE9 supports the XMLSerialize, hence use the following check for IE if (window.ActiveXObject && (new XMLSerializer()) === undefined) {
  • wloescher
    wloescher almost 12 years
    This worked great for a Windows 8 Metro app where I needed to store the XML as text in local storage, read it, and then process is into anonymous objects. I didn't have to rework any of my existing (which was expecting responseXML) at all. Thanks! +1
  • ZiggyTheHamster
    ZiggyTheHamster over 9 years
    This only works because jQuery has created HTML nodes for these. For something where jQuery is treating them like XML nodes (like $($.parseXML("<xml></xml>")), this will not work.
  • U-Dev
    U-Dev about 4 years
    You made my day man !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!‌​!!!!!!!!!!!!!!!!!!!!‌​!!!!!!!!!!!!!!!!!!!!‌​!!!!!!!!!!!!!!!!!!!!‌​!!!!!!!!!!!!!! Love Youuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu!!!!!!‌​!!!