2010-10-26 49 views
1

我想解析一個XML文件,它在FF中完美工作,但不在IE中。請幫助調試。代碼如下。XML解析不工作在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

請發佈您的xml結構 – 2010-10-26 09:11:01

回答

2

您的代碼,改進並註明:

  • 抽象的東西像XMLHTTP請求到專用功能的可重用性
  • 始終使用聲明變量的var關鍵詞;忘記這是一個討厭的錯誤的來源
  • 儘可能使用有意義的變量名稱;單字母域名適合循環計數器,但不是很多其他
  • 永遠也同步HTTP請求,使用回調而不是
  • 功能,首先要做的完整性檢查,並返回早期往往不夠深入嵌套
  • 不建立HTML與document.write(),使用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,這很難說。

+0

xml結構 ----------------- – Sullan 2010-10-29 07:19:50

+0

<?xml version =「1.0」encoding =「utf-8」?> 通過 找到許可證3 通行證 許可證被found3 通行證 許可證是found3 Sullan 2010-10-29 07:20:27

0

我有類似的問題,以下代碼適用於所有瀏覽器...訣竅是使用單獨的代碼XML爲IE瀏覽器或版本少於10。

所以每次阿賈克斯時間調用方法parseXml被調用,輸入參數XML DOM或文本,根據瀏覽器....如果當前瀏覽器是IE,將其上傳XML文檔,過程中它根據微軟的標準和回報XML和Ajax中的其他進程按預期進行!

注:browser.msie不jQuery的1.9支持,但你可以以使其兼容或使用的userAgent,發現這是當前的瀏覽器添加jQuery的遷移,1.2.1.min.js

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