XML解析不在IE中工作

时间:2010-10-26 09:07:15

标签: javascript xml

我正在尝试解析XML文件,它在FF中完美运行但不在IE中。请帮忙调试一下。代码如下。

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].getElementsByTagName("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>");

2 个答案:

答案 0 :(得分:3)

您的代码,经过改进和注释:

  • 像XmlHttp这样的抽象事物请求到专用函数以实现可重用性
  • 始终使用var关键字来声明变量;忘记这是令人讨厌的错误来源
  • 尽可能使用有意义的变量名称;单字母名称适用于循环计数器,但不适用于其他许多
  • 从不执行同步HTTP请求,而是使用回调
  • 首先进行健全性检查并且早期返回的函数往往不太深入嵌套
  • 不要使用document.write()构建HTML,而是使用DOM
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();
}

现在我们可以按如下方式使用它:

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

我怀疑你的问题在于:

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

也许您正在假设文档结构不正确。但除非您发布XML,否则很难说。

答案 1 :(得分:0)

我有类似的问题,以下代码适用于所有浏览器......诀窍是为IE浏览器使用单独的代码XML,或者是小于10的版本。

因此,每次调用Ajax时,都会使用输入参数XML Dom或文本调用parseXml,具体取决于浏览器....如果当前浏览器是IE,则上传XML文档,根据Microsoft标准处理它并返回XML Ajax中的其余进程按预期进行!!

注意:jQuery 1.9不支持browser.msie,但您可以添加jquery-migrate-1.2.1.min.js以使其兼容或使用userAgent并查找哪个是当前浏览器

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