读取大型XML文件时出现Javascript错误

时间:2014-09-09 12:45:44

标签: javascript xml

我正在使用以下代码阅读大型sitemap.xml文件:

<div id="urls"></div>
<script type="text/javascript" language="javascript">

    var xmlhttp;
    if(window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState==4 && xmlhttp.status==200) {

            loc = xmlhttp.responseXML.documentElement.getElementsByTagName("loc");
            for(i=0;i<loc.length;i++) {
                document.getElementById("urls").appendChild(document.createTextNode( loc[i].firstChild.nodeValue ));
                document.getElementById("urls").appendChild(document.createElement("br"));
            }
            document.getElementById("urls").innerHTML = table;
        }       
    }
    xmlhttp.open("GET", "sitemap.xml", true);
    xmlhttp.send(null);

</script>

当读取超过1000行的XML文件时,它会出错,并带有以下详细信息:

  
    

未捕获的TypeError:无法读取属性&#39; documentElement&#39; of null(index):xmlhttp.onreadystatechange

  

关于如何解决这个问题的任何想法?尝试过我在网上找到的一些东西,但无法正常使用。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

您必须检查responseXML是否为null。如果服务器返回的XML文件有解析错误,则会发生这种情况。

var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

xmlhttp.onreadystatechange = function () {
    var locs, i, urls = document.getElementById("urls");

    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {
        if (this.responseXML) {
            locs = this.responseXML.documentElement.getElementsByTagName("loc");

            for (i = 0; i < locs.length; i++) {
                urls.appendChild(document.createTextNode(locs[i].firstChild.nodeValue));
                urls.appendChild(document.createElement("br"));
            }

            // What is that line? I've taken it from your code, but it can't be right.
            urls.innerHTML = table;
        } else {
            // responseXML is null if the response has XML parsing errors
            alert("The server did not send a proper sitemap file.");
        }
    }
};

xmlhttp.open("GET", "sitemap.xml");
xmlhttp.send();

另外,如上所示,您应该从不使用同步请求。拥有像onreadystatechange这样的事件处理回调函数的全部意义是能够发出异步请求。

MDN上还有一个大红色警告:https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest#onreadystatechange

要学习的经验教训:

  1. 如果对象没有事先检查它们是否有效,切勿使用它们。
  2. 绝不使用JavaScript的同步HTTP请求。