开发者

XML Parsing not working in IE

I am trying to parse a XML file, it works perfectly in FF but dont in IE. Pls help debug this. The code is as follows.

if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xmlhttp.open("GET","books.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML; 

document.write("<table border='1'>");
var x=xmlDoc.getElementsByTagName("StepName");
for (i=0;i<x.length;i++)
  { 
  document.write("<tr><td>");
  document.write(x[i].getAttribute("name")); 
  document.write("</td><td>");  
  document.write(x[i].getElementsBy开发者_高级运维TagName("StepStatus")[0].childNodes[0].nodeValue);
  document.write("</td><td>");
  document.write(x[i].getElementsByTagName("StepDescription")[0].childNodes[0].nodeValue);
  document.write("</td></tr>");
  }
document.write("</table>");


Your code, improved and annotated:

  • abstract things like XmlHttp requests into dedicated functions for reusability
  • always use the var keyword for declaring variables; forgetting this is a source of nasty bugs
  • use meaningful variable names wherever possible; single-letter names are suitable for loop counters but not for a lot else
  • never do synchronous HTTP requests, use callbacks instead
  • functions that do sanity checks first and return early tend to be less deeply nested
  • do not build HTML with document.write(), use the DOM instead
function getXml(url, onsuccess) {
    var xmlhttp;

    if (window.XMLHttpRequest) { // IE10+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else { // IE5 - IE9
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }

    xmlhttp.open("GET", url, true);
    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState != 4) return;
        if (xmlhttp.statusCode !== 200 || !xmlhttp.responseXML) return;
        if (typeof onsuccess !== "function") return;

        onsuccess.call(xmlhttp, xmlhttp.responseXML);
    };
    xmlhttp.send();
}

Now we can use it as follows:

getXml("books.xml", function (xmlDoc) {
    var table = e("table", document.body), // see helper function e below
        steps = xmlDoc.getElementsByTagName("StepName"),
        i, step, tr;

    for (i = 0; i < steps.length; i++) {
        step = steps[i];
        tr = e("tr", table);
        e("td", tr, step.getAttribute("name"));
        e("td", tr, step.getElementsByTagName("StepStatus")[0].childNodes[0].nodeValue);
        e("td", tr, step.getElementsByTagName("StepDescription")[0].childNodes[0].nodeValue);
    }
});

// helper function to build HTML elements with the DOM
function e(name, parentNode, text) {
    var elem = document.createElement(name),
        textProp = elem.hasOwnProperty("textContent") ? "textContent" : "innerText";
    if (text) elem[textProp] = text;
    if (parentNode && parentNode.appendChild) parentNode.appendChild(e);
    return elem;
}

I suspect that your problem lies here:

step.getElementsByTagName("StepStatus")[0].childNodes[0].nodeValue

Maybe you are making assumptions about the document structure that are incorrect. But unless you post your XML, this is hard to say.


i had similar problem and following code works for all browser ...the trick is use separate code XML for IE browsers or that are version of less than 10 .

so every time Ajax is call a method parseXml is called with input parameter XML Dom or text, depending on browser .... and if current browser is IE, it upload XML doc, process it according to Microsoft standards and return XML and rest of processes in Ajax carries on as expected!!

note : browser.msie is not supported in jQuery 1.9 but you can add jquery-migrate-1.2.1.min.js in order to make it compatible or use userAgent and find which is current browser

 $.ajax({
  type: 'GET',
  url: 'XML_file.xml',
  dataType: ($.browser.msie) ? "text" : "xml",
  success: function (xml) {

     var processedXML = parseXml(xml);

     $(processedXML).find('my record').each(function () {  //code  } 
 });


 function parseXml(xml) {

 if ($.browser.msie)  {

  if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp = new XMLHttpRequest();
  }
  else {// code for IE6, IE5
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
   }

    xmlhttp.open("GET", "XML_file.xml", false);
    xmlhttp.send();
    xmlDoc = xmlhttp.responseXML;

    xml = xmlDoc;
}
        return xml;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜