问题描述:客户端使用Ajax向服务器请求的时候,服务器返回的数据responseText有内容,但返回的responseXML为空。
解决方法:
1、服务端没有设置返回的内容格式,因为response默认返回格式为"text/html",要把它改为response.ContentType="text/xml",才能正确解析。
2、xml的内容格式不正确,可以通过将xml的内容输出,好好检查xml的格式是否正确,本人因为在aspx页面设置了Trace=true进行调试,结果在返回的XML片段中附件了一大堆调试信息,从而破坏了XML的格式,导致客户端无法获得responseXML对象。注意对于IE浏览器responseXml可以使用,其他非IE不能使用responseXml属性,但responseXML对于浏览器通用。
3、 另外,xml的内容数据格式正确,我在.net的使用中,出现了在IE下能够正确获取到responseXml的数据并可以正确的解析,但是非IE,如360浏览器等得到responseXml的数据为null的问题,此时通过调试,并不是xml的数据格式有问题,此时用另一种解决方案来解决这个问题,详见 利用ajax技术实现动态双组合功能
解决思路如下:
// 2. 设置回调函数 xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { //alert(xhr.responseText); var html = ""; var data; if (xhr.responseXml != null) {//IE浏览器 alert(xmlToString(xhr.responseXml)); data = xhr.responseXml.getElementsByTagName("ArticleComment"); } else if (xhr.responseXML != null) {//非IE,如360浏览器 //alert(xmlToString(xhr.responseXML)); // retText = xhr.responseText; // retText = retText.substr(0, 19) + retText.substr(36); data = xhr.responseXML.getElementsByTagName("ArticleComment"); } if (data.length > 0) { for (var i = 0; i < data.length; i++) { html += renderItem(data[i]); } } document.getElementById("commentContent").innerHTML = html; //$('#commentContent').html(html); //取到数据后将当前页更新 currentPageIndex = pageIndex; } }; function renderItem(data) { // alert(xmlToString(data)); //alert(data.getElementsByTagName("FaceUrl")[0].textContent); var html = "<div class='t'><div class='tt'><div class='tt1'>"; html += "<img src='../static/images/face/" + getElementContent(data, "FaceUrl") + "' />"; //FaceUrl html += " 评论者匿称:" + getElementContent(data, "LoginName") + "</div>"; //Author html += "<div align='right'>"; html += "<div align='right'>"; //联系地址 html += "<div id='f" + getElementContent(data, "RowNo") + "' class='userinfo' style='display: none'>" + "<p><label>IP地址:</label><label>" + getElementContent(data, "HostIP") + "</label></p>" + "<p><label>姓名:</label><label>" + getElementContent(data, "RealName") + "</label></p>" + "<p><label>用户ID:</label><label>" + getElementContent(data, "UserId") + "</label></p>" + "<p><label>Mail:</label><label>" + getElementContent(data, "Email") + "</label></p></div></div>"; html += "</div></div><div>"; html += "<div class='tt2'><div align='left' class='tt3'>" + getElementContent(data, "CommentContent") + "</div>"; //Content html += "<div class='gray' align='right'>" + getElementContent(data, "RowNo") + "# 发表于:" + getElementContent(data, "CommentDate") + " </div>"; //RowNo PostTime html += "</div></div></div>"; return html; } function getElementContent(element, tagName) { var childElement = element.getElementsByTagName(tagName)[0]; return (childElement.text != undefined) ? childElement.text : childElement.textContent; }