我正在使用以下代码阅读大型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
关于如何解决这个问题的任何想法?尝试过我在网上找到的一些东西,但无法正常使用。
非常感谢你的帮助。
答案 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
要学习的经验教训: