`
daoger
  • 浏览: 531667 次
  • 性别: Icon_minigender_1
  • 来自: 山东济南
社区版块
存档分类
最新评论

responseXML为空?

阅读更多
最近不怎么忙,正用dhtmlXGrid搞一个自己的小系统!
前一个页面都正常,前天做一个新页面的时候出现了问题:页面不能正常解析服务器端返回的数据,总是报Incorrect XML的错误;

百度了一下,又进行了调试得知是receponseXML为空导致的。可是我前一个页面也是使用的同一个Util类生成的XML文件的啊!
由于需要的xml文件比较简单,也没有采用xml文件的生成工具,这下麻烦死了。

从昨天就开始找问题所在,搞得头都大了,也还是没戏!

将重要部分的代码贴出来,请各位帮忙瞅瞅!

发送请求(来自dhtmlXCommon.js)
dtmlXMLLoaderObject.prototype.loadXML = function (filePath, postMode, postVars) {
	if (this.rSeed) {
		filePath += ((filePath.indexOf("?") != -1) ? "&" : "?") + "a_dhx_rSeed=" + (new Date()).valueOf();
	}
	this.filePath = filePath;
	alert(this.filePath);
	if (window.XMLHttpRequest) {
		this.xmlDoc = new XMLHttpRequest();
		this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async);
		if (postMode) {
			this.xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		}
		this.xmlDoc.onreadystatechange = new this.waitLoadFunction(this);
		this.xmlDoc.send(null || postVars);
	} else {
		if (document.implementation && document.implementation.createDocument) {
			this.xmlDoc = document.implementation.createDocument("", "", null);
			this.xmlDoc.onload = new this.waitLoadFunction(this);
			this.xmlDoc.load(filePath);
		} else {
			this.xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
			this.xmlDoc.open(postMode ? "POST" : "GET", filePath, this.async);
			if (postMode) {
				this.xmlDoc.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			}
			this.xmlDoc.onreadystatechange = new this.waitLoadFunction(this);
			this.xmlDoc.send(null || postVars);
		}
	}
};

///////////////////////////////////////////////////////////////////////////
dtmlXMLLoaderObject.prototype.waitLoadFunction = function (dhtmlObject) {
	this.check = function () {
		if (dhtmlObject.onloadAction != null) {
			if ((!dhtmlObject.xmlDoc.readyState) || (dhtmlObject.xmlDoc.readyState == 4)) {
				dhtmlObject.onloadAction(dhtmlObject.mainObject, null, null, null, dhtmlObject);
				if (dhtmlObject.waitCall) {
					dhtmlObject.waitCall();
					dhtmlObject.waitCall = null;
				}
				dhtmlObject = null;
			}
		}
	};
	return this.check;
};


////////////////////////////////////////
//下面是取首节点,其中tagName为"rows"
出错页面调用时,我用alert(this.xmlDoc.responseXML.xml)查看的到是空值;用alert(this.xmlDoc.responseText)查看得到的是本页面的html文件;而在没有错误的页面得到的都是服务器传回的XML文件。
dtmlXMLLoaderObject.prototype.getXMLTopNode = function (tagName) {
	if (this.xmlDoc.responseXML) {
		var temp = this.xmlDoc.responseXML.getElementsByTagName(tagName);
		var z = temp[0];
	} else {
		var z = this.xmlDoc.documentElement;
	}
	if (z) {
		this._retry = false;
		return z;
	}
	if ((_isIE) && (!this._retry)) {
		var xmlString = this.xmlDoc.responseText;
		this._retry = true;
		this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		this.xmlDoc.async = false;
		this.xmlDoc.loadXML(xmlString);
		return this.getXMLTopNode(tagName);
	}
	dhtmlxError.throwError("LoadXML", "Incorrect XML", [this.xmlDoc, this.mainObject]);
	return document.createElement("DIV");
};



这是我生成xml文件的类XmlUtil.java
package pfm.web.util;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

public class XmlUtil
{
	StringBuffer xmlBuffer = new StringBuffer();

	HttpServletRequest request = null;

	HttpServletResponse response = null;

	public XmlUtil(HttpServletRequest request, HttpServletResponse response)
	{
		this.request = request;
		this.response = response;
		xmlBuffer.append("<?xml version='1.0' encoding='UTF-8'?>");
		xmlBuffer.append("<rows>");
		xmlBuffer.append("</rows>");
	}

	public void setId(String id)
	{
		xmlBuffer.insert(xmlBuffer.lastIndexOf("</rows>"), "<row id='" + id + "'></row>");
	}

	public void setXmlData(Object cell)
	{
		if (xmlBuffer.lastIndexOf("</row>") > 0)
			xmlBuffer.insert(xmlBuffer.lastIndexOf("</row>"), "<cell>" + cell + "</cell>");
	}

	public String getXmlFile()
	{
		return new String(xmlBuffer);
	}

	/**
	 * 从请求的输入流中读取并解析数据
	 */
	public List getXmlData()
	{
		List l = new ArrayList();
		try
		{
			SAXBuilder xmlbuiilder = new SAXBuilder();
			BufferedInputStream buinst = new BufferedInputStream(request.getInputStream());
			Document document = xmlbuiilder.build(buinst);
			Element root = document.getRootElement();
			for (Iterator it = root.getChildren("row").iterator(); it.hasNext();)
			{
				Element row = (Element) it.next();
				Object[] o = new Object[row.getChildren().size() + 1];
				o[0] = row.getAttributeValue("id");
				int i = 1;
				if (!row.getChildren().isEmpty())
					for (Iterator itcell = row.getChildren("cell").iterator(); itcell.hasNext();)
					{
						Element cell = (Element) itcell.next();
						o[i++] = cell.getText();
					}
				l.add(o);
			}

		} catch (Exception e)
		{
			e.printStackTrace();
		}
		return l;
	}

	/**
	 * 将服务器响应以xml形式返回客户端
	 */
	public void returnResultXml(String resultxml)
	{
		System.out.println("resultxml==" + resultxml);
		try
		{
			response.setContentType("text/xml; charset=UTF-8");
			response.setHeader("Cache-Control", "no-cache");
			response.getWriter().write(resultxml);
			response.getWriter().flush();
		} catch (IOException e)
		{
			e.printStackTrace();
			try
			{
				response.getWriter().write("<flag>0</flag>");
			} catch (Exception fe)
			{
			}
		}
	}
}



这是在service层的处理方法
public class DailyReceiptsServiceImp implements DailyReceiptsService
{
	private DailyReceiptsDao dailyReceiptsDao;

	private HelpUtil help;

	public void setDailyReceiptsDao(DailyReceiptsDao dailyReceiptsDao)
	{
		this.dailyReceiptsDao = dailyReceiptsDao;
	}

	public void buildQueryXML(HttpServletRequest request, HttpServletResponse response)
	{
		XmlUtil xmlutil = new XmlUtil(request, response);
		help = new HelpUtil();

		List list = this.dailyReceiptsDao.findTotal();
		if (list != null)
		{
			for (Iterator it = list.iterator(); it.hasNext();)
			{
				DailyReceipts dailyReceipts = (DailyReceipts) it.next();
				xmlutil.setId(dailyReceipts.getId().toString());
				xmlutil.setXmlData(dailyReceipts.getIncomer());
				xmlutil.setXmlData(dailyReceipts.getIncometype());
				xmlutil.setXmlData(help.myDateFormat(dailyReceipts.getIncomedate()));
				xmlutil.setXmlData(dailyReceipts.getCurrencytype());
				xmlutil.setXmlData(dailyReceipts.getState());
				xmlutil.setXmlData(help.chanToGB(dailyReceipts.getLocation()));
			}
		}
		xmlutil.returnResultXml(xmlutil.getXmlFile());
	}
}


其他的地方没有什么特别的了;
我在网上搜了一下,有网友对这种问题总结了四种错误:
调试此问题的四个步骤:
     1. 是否将 content type 设置为 text/xml 文件格式?
     2. 是否确定将请求发送到服务器端了?
     3. 输出 responseText,返回的内容是否是你想要的xml文件 ?
     4. 在浏览器中直接输入返回 xml 文档的网址,检查一下返回的 xml 格式是否正确。

原文网址:
http://radio.javaranch.com/pascarello/2006/09/12/1158096122600.html

请求能够发送到服务器端,我在将xml返回前在服务器端输出了xml,显示正常,服务器端也能正常响应请求,输出的responseText不对,看来我就是第三种啊!

用ajax时间不长,还请各位多多帮忙!
分享到:
评论
8 楼 daoger 2007-08-03  
其实很简单,是一个低级错误;我在转发页面的时候,应该return null.
7 楼 zhenhui 2007-07-31  
能不能告诉我怎么解决这个问题?
6 楼 daoger 2007-01-15  
问题解决了!
是我在服务器端进行数据校验后,使用springMVC页面转向的问题!
5 楼 daoger 2007-01-12  
Ivan Li 写道
dhtmgrid如果返回的是text,它会自己把它转化成document对象的,构建XML对象,建议使用dom4j,很方便的说
dtmlXMLLoaderObject.prototype.loadXMLString=function(xmlString){
 try
{
 var parser = new DOMParser();
 this.xmlDoc = parser.parseFromString(xmlString,"text/xml");
}
 catch(e){
 this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
 this.xmlDoc.async=this.async;
 this.xmlDoc.loadXML(xmlString);
}
 this.onloadAction(this.mainObject,null,null,null,this);
 if(this.waitCall){this.waitCall();this.waitCall=null;}
}


哦!谢谢!我再搞搞看看!
4 楼 IvanLi 2007-01-12  
dhtmgrid如果返回的是text,它会自己把它转化成document对象的,构建XML对象,建议使用dom4j,很方便的说
dtmlXMLLoaderObject.prototype.loadXMLString=function(xmlString){
 try
{
 var parser = new DOMParser();
 this.xmlDoc = parser.parseFromString(xmlString,"text/xml");
}
 catch(e){
 this.xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
 this.xmlDoc.async=this.async;
 this.xmlDoc.loadXML(xmlString);
}
 this.onloadAction(this.mainObject,null,null,null,this);
 if(this.waitCall){this.waitCall();this.waitCall=null;}
}
3 楼 LucasLee 2007-01-12  
我以前也碰到responseXML为空的问题,但是responseText不为空,后来我就统一用responseText作为返回值了,当然,我用的也不是XML格式。
2 楼 daoger 2007-01-12  
现在前几个页面中也或多或少的存在一些bug.而且我还没搞清楚是我的代码有问题还是dhtmlXGrid(免费版)的问题,问题解决了我会把代码共享出来的!

1 楼 waiangelet 2007-01-11  
我也想学习这方面的实例,你可不可以把上面的资料打个包共享出来阿?先谢谢了。

相关推荐

    异步调用webservice返回responseXML为空的问题解决方法

    在异步调用webservice的过程中,返回的responseXML为空是一个相对常见的问题。这通常与浏览器兼容性、XML处理方法或者SOAP消息格式有关。下面,我们将详细介绍与这一问题相关的知识点。 ### JavaScript对XML的加载...

    Ajax深入学习

    - 当readyState为0、1或2时,responseText为空字符串。 - 当readyState为3时,responseText包含未完成的响应信息。 - 当readyState为4时,responseText包含完整的响应信息。 - **responseXML**:当readyState为4...

    去空格正则表达式

    3. **执行替换操作**:调用`Replace`方法,传入需要处理的字符串`ResponseXml`以及替换为空字符串(即`""`),从而达到去除字符串中所有空格的目的。 4. **返回处理结果**:将处理后的字符串返回给调用者。 #### ...

    AJAX入门

    - 在`readyState`为0、1或2时,`responseText`为空字符串。 - 在`readyState`为3时,`responseText`包含部分响应文本。 - 在`readyState`为4时,`responseText`包含完整的响应文本。 ##### 3. **responseXML属性...

    全面剖析XMLHttpRequest对象

    在`readyState`为0、1或2时,该属性为空字符串;在`readyState`为3时,包含部分响应文本;当`readyState`达到4时,表示响应已完全接收,`responseText`包含完整响应内容。 **4. responseXML属性** 对于XML格式的...

    XMLHTTP.rar_xmlhttp

    - `send()`:发送请求,如果是GET请求,可以为空;如果是POST请求,需要传入数据。 - `abort()`:中断当前的HTTP请求。 - `setRequestHeader()`:设置HTTP请求头,例如设置Content-Type为"application/x-...

    Ajax实现原理和使用详解

    - 调用 `send()` 方法,如果为 GET 请求,可直接发送空参数;如果是 POST 请求,则需要传递数据。 - 注册 `onreadystatechange` 事件处理函数,检查 `readyState` 和 `status` 状态,确保请求已完成且成功。 4. *...

    ajax运用实例得到的得到

    var XMLHttpReq = false;... window.alert("用户名不能为空。"); document.myform.uname.focus(); return false; } else { sendRequest('login2?uname='+ uname + '&psw=' + psw); } } &lt;/script&gt;

    《XMLHTTP对象参考手册》 CHM

    如果是GET请求,data应为空。 3. `abort()`:取消当前的HTTP请求。 XMLHTTP对象还有其他辅助方法,如`setRequestHeader(header, value)`用于设置HTTP请求头,以及`setTimeouts(timeout, timeout, timeout, timeout)...

    jsp ajax实例

    很好的ajax实例 ... window.alert("用户名不能为空。"); document.myform.uname.focus(); return false; } else { sendRequest('login2?uname='+ uname + '&psw=' + psw); } } &lt;/script&gt;

    xmlhttp详细帮助文档!!

    对于GET请求,参数为空;对于POST请求,参数通常是序列化后的数据。 4. 监听状态变化:通过`onreadystatechange`事件监听请求状态。xhr.readyState有五个状态,0-4分别代表请求的不同阶段。 5. 处理响应:当状态变为...

    XML应用开发(软件品牌)-1期 6.2 案例分析-加载XML文档.doc

    例如,检查`xmlDoc`是否不为空,确认XML文档是否已成功加载并准备就绪。 案例1展示了一个简单的HTML页面内嵌JS脚本加载XML文档的例子。在这个例子中,XML文件包含书籍数据,而HTML页面中的JavaScript代码创建了DOM...

    Ajax基本操作实例

    6. **处理响应**:当`readyState`为4且`status`为200时,表示请求成功,此时可以通过`responseText`或`responseXML`获取服务器响应。 ### 三、Ajax与SQL结合 在实际应用中,Ajax常用于与数据库进行交互。这里以...

    jQuery AJAX XMLHttpRequest对象PPT

    - responseText或responseXML属性:分别用于获取响应的数据,前者为文本形式,后者为XML形式(如果服务器返回XML数据)。 - onreadystatechange事件:当readyState属性变化时触发,通常用来监控请求的进度。 - ...

    Ajax学习笔记,希望大家喜欢

    5. **处理响应**:在`onreadystatechange`事件处理程序中,当`readyState`为4(表示请求完成)且`status`为200(表示请求成功)时,可以通过`responseText`或`responseXML`获取服务器的响应数据。 6. **更新页面**...

    ajax示例Demo

    当readyState属性值变为4(表示请求已完成),且status属性值为200(表示成功)时,我们可以通过responseText或responseXML获取服务器返回的数据。 2. **GET请求示例** - **GET请求**是最常见的Ajax请求方式,用于...

    AJAX新手教程

    对于GET请求,参数为空;对于POST请求,可以传递数据。 ### 三、处理响应 1. `onreadystatechange`事件:当服务器响应状态改变时触发,通过`readyState`属性检查请求是否完成。 2. `status`属性:返回HTTP状态码...

    Ajax基础教程,是初学者的一个首要选择,内容详细丰富,简单易懂,是学习的好帮手....rar

    如果是GET请求,参数为空;POST请求时,参数为要发送的数据。 4. 监听状态变化:通过`onreadystatechange`事件监听请求状态。当状态变为4(表示请求已完成)且状态码为200(表示成功)时,表示请求成功。 5. 处理...

Global site tag (gtag.js) - Google Analytics