【问题标题】:Read XML file using JavaScript in Chrome在 Chrome 中使用 JavaScript 读取 XML 文件
【发布时间】:2013-08-26 10:39:10
【问题描述】:

我需要使用 JavaScript 加载和读取 XML 文件。

以下代码在 Firefox、IE 和 Opera 中运行良好:

function loadXMLDoc(dname) {
  var xmlDoc

  // Internet Explorer
  try {
    xmlDoc = new ActiveXObject('Microsoft.XMLDOM')
  }
  catch (e) {
    // Firefox, Opera, etc.
    try {
      xmlDoc = document.implementation.createDocument('', '', null)
    }
    catch (e) {
      alert(e.message)
    }
  }

  try {
    xmlDoc.async = false
    xmlDoc.load(dname)
    return xmlDoc
  }
  catch (e) {
    alert(e.message)
  }

  return null
}

但是在 Chrome 中执行这段代码给了我这个错误:

Object# 没有“加载”方法

【问题讨论】:

  • 不只是loadXML 而不是load
  • 嗨@putvande..谢谢你回复我,我不能从你这里得到吗? Loadxml 只是从 w3school 网站获取的功能。我的问题是 chrome 浏览器无法正常工作。对我的问题有什么想法吗?
  • 为什么使用 XMLDocument 对象而不是 DOMParser/Microsoft.XMLDOM?您可以使用 xhmlhttp 请求加载 xml 文本。
  • 嗨@HMR..我明白你的意思..我是 xml 解析功能的新手。我只搜索 XML DOM..我对 Dom-parser 有更多的了解。你能给一些想法吗我?对我更有帮助
  • 嗨@HMR..你知道吗?请您发表一些负责任的评论。

标签: javascript xml xmldom


【解决方案1】:

旧代码

document.implementation.createDocument 不适用于 Chrome 和 Safari。

尽可能使用XMLHttpRequest

function loadXMLSync(url) {
  try {
    // Prefer XMLHttpRequest when available
    var xhr = new XMLHttpRequest()
    xhr.open('GET', url, false)
    xhr.setRequestHeader('Content-Type', 'text/xml')
    xhr.send()

    return xhr.responseXML
  }
  catch (e) {
    // XMLHttpRequest not available, fallback on ActiveXObject
    try {
      var activex = new ActiveXObject('Microsoft.XMLDOM')
      activex.async = false
      activex.load(url)

      return activex
    }
    catch (e) {
      // Neither XMLHttpRequest or ActiveXObject are available
      return undefined
    }
  }
}

现代浏览器

如果您的目标是现代浏览器 (> IE6),只需使用 XMLHttpRequest:

function loadXMLSync(url) {
  var xhr = new XMLHttpRequest()

  xhr.open('GET', url, false)
  xhr.setRequestHeader('Content-Type', 'text/xml')
  xhr.send()

  return xhr.responseXML
}

【讨论】:

  • ActiveXObject 不是在现代浏览器中弃用了吗?
【解决方案2】:

在 MDN 上,有使用 XMLHttpRequest 的指南。但是在您深入研究返回类型并看到 Google Chrome 不支持 XMLDocument 之前,从 DOMImplementation.createDocument 中并不清楚。 example on W3Schools 使用 XMLHttpRequest。

【讨论】:

    【解决方案3】:

    按照这个来打印,加载,附加xml数据。这里xml在javascript中存储为字符串。这个方法在chrome中有效,firefox希望它也能在其他人中工作

    txt="<papers>"+"<paper>"+
     "<author>athor name</author>"+
    "<title>title</title>"+
    "<path>path</path>"+
    "<track>which tack</track>"+
     "</paper>"+
    "<paper>"+
    "<author>athor name</author>"+
    "<title>title</title>"+
    "<path>path</path>"+
    "<track>which tack</track>"+
    "</paper>"+
    "<paper>"+
    "<author>athor name</author>"+
    "<title>title</title>"+
    "<path>path</path>"+
    "<track>which tack</track>"+
    "</paper>"+
    "<papers>";
    if (window.DOMParser)
      {
          parser=new DOMParser();
      xmlDoc=parser.parseFromString(txt,"text/xml");
    
       }
       else // Internet Explorer
        {
         xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
         xmlDoc.async=false;
         xmlDoc.loadXML(txt);
        }
    
    x=xmlDoc.getElementsByTagName("paper"); 
    for (var i = 0; i < x.length; i++) {  
        var athor =x[i].childNodes[0].firstChild.nodeValue;
        var title = x[i].childNodes[1].firstChild.nodeValue;
        var path = x[i].childNodes[2].firstChild.nodeValue;
        var tack =x[i].childNodes[3].firstChild.nodeValue;
        //do something with these values...
        //each iteration gives one paper details    
        var xml=document.getElementById("element_id");//<div id="element_id"></div>
        var li = document.createElement("br");// create a new <br>  
        newlink = document.createElement('A'); // creating an <a> element
        newlink.innerHTML = athor;// adding <a>athor value here</a>
        newlink.setAttribute('href', path);// <a href="path"></a>
    
        newlink.appendChild(li);// <a href="path">athor</a><br>
        document.getElementById("element_id").appendChild(newlink);
    //finaly it becomes <div id="element_id"><a href="path">athor</a><br></div>
    
    
    }
    

    我发布了这个答案here

    【讨论】:

      【解决方案4】:

      添加

          var xhr = new XMLHttpRequest(); 
          xhr.open("GET", "/example/xdom/books.xml", false); 
          xhr.send(null); 
          xmlDoc = xhr.responseXML.documentElement; 
          return xmlDoc;
      

      catch 声明中。如下:

      function loadXMLDoc(dname) {
        var xmlDoc
      
        // Internet Explorer
        try {
          xmlDoc = new ActiveXObject('Microsoft.XMLDOM')
        }
        catch (e) {
          // Firefox, Opera, etc.
          try {
            xmlDoc = document.implementation.createDocument('', '', null)
          }
          catch (e) {
            alert(e.message)
          }
        }
      
        try {
          xmlDoc.async = false
          xmlDoc.load(dname)
          return xmlDoc
        }
        catch (e) {
          //alert(e.message)
          // For Chrome 
          var xhr = new XMLHttpRequest(); 
          xhr.open("GET", "/example/xdom/books.xml", false); 
          xhr.send(null); 
          xmlDoc = xhr.responseXML.documentElement; 
          return xmlDoc;
        }
      
        return null
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-18
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-24
        相关资源
        最近更新 更多