为什么responseXML读不到文件,而responsetext就可以?
XML 文件(test.xml):
<?xml version="1.0" encoding="UTF-8"?>
<root>
<data>this is a test</data>
</root>
Javascript文件:
var req;
function showWindow()
{
req = new ActiveXObject("Microsoft.Xmlhttp");
req.open("GET","earth.xml",true);
req.onreadystatechange = callback;
req.send(null);
}
function callback()
{
if(req.readyState == 4 && (req.Status == 0 || req.Status == 200))
{
var resp= req.responseXml;
var data= resp.getElementsByTagName("data")[0];
alert("data =" + data);
}
}
显示的 data=null;
但是如果换成req.responseText; 则能显示出完成的xml文件内容。
为什么用responseXml就得不到正确的值呢?
问题点数:20、回复次数:33Top
1 楼zoujiaxue(灵魂学校)回复于 2006-09-30 09:00:41 得分 0
var resp=this.req.responseXML.documentXML;Top
2 楼everlily()回复于 2006-09-30 09:14:17 得分 0
我试过了,还是不行。Top
3 楼eclipse32()回复于 2006-09-30 09:26:16 得分 0
var xmlDOM=resp.responseXML;
var rootNode=xmlDOM.documentElement;
try{
var info = rootNode.getElementsByTagName('data');
alert("data =" + info[0].firstChild.data);
}catch(exception){}Top
4 楼everlily()回复于 2006-09-30 09:43:44 得分 0
还是不行,rootNode=nullTop
5 楼eclipse32()回复于 2006-09-30 11:10:15 得分 0
你调用的是test.xml还是earth.xml?呵呵,怎么会是null?Top
6 楼gsh945(太平洋底)回复于 2006-09-30 11:19:47 得分 0
(req.Status == 0 || req.Status == 200)
只要 req.Status==200 行不行,你试一下Top
7 楼gsh945(太平洋底)回复于 2006-09-30 11:20:43 得分 0
你调用的是test.xml还是earth.xml?呵呵,怎么会是null?
是啊,好像调用文件写错了阿
Top
8 楼everlily()回复于 2006-09-30 13:08:07 得分 0
文件没调错,我的帖子里写错了。
因为responseText都能显示出正确的earth.xml文件的内容,但是responseXML就不行。
我还试过加上setRequestHeader("Content-type","text/xml").也不行。Top
9 楼chaircat(chaircat)回复于 2006-09-30 14:34:02 得分 0
因为你的内容不符合XML标准...
XML语法要求很严,只要有一点不符就不行...Top
10 楼zoujiaxue(灵魂学校)回复于 2006-09-30 21:29:24 得分 0
你先测试一下你的.aspx页面是不是能够生成正确的XML文档Top
11 楼medusagjf(郭婉仪)回复于 2006-10-03 12:57:22 得分 0
是存在这个问题,你可以这样来读
var xmlDoc;
//得到xml上下文
function getXMLHandler(xmlFile){
if(window.ActiveXObject){
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.onreadystatechange = function() {
if(xmlDoc.readyState == 4) doAction();
}
xmlDoc.load(xmlFile);
}else if(document.implementation&&document.implementation.createDocument){
xmlDoc=document.implementation.createDocument('','',null);
xmlDoc.onload=doAction();
xmlDoc.load(xmlFile);
}else return null;
return xmlDoc;
}
把xml文件传给这个函数后,就可以用xmlDoc.getElementsByTagName('data');得到节点里得值了Top
12 楼hanpoyangtitan(韩波洋)回复于 2006-10-03 13:14:47 得分 0
楼主的原因:缺少了属性text
var data=resp.getElementsByTagName("data")[0].text;
var data=resp.selectSingNode("//data").text;
var data=resp.selectNodes("data")[0].text;
不要忘记是取值,因为还有getAttribute("@id")Top
13 楼shaipe(鹏海轻舟)回复于 2006-10-07 23:22:40 得分 0
应该是你的Xml格式不正确或者没有把Contenttype设为Text/xml的原因吧
Top
14 楼everlily()回复于 2006-10-08 16:39:50 得分 0
以上各位说的,我都试过了,都没有用。
今天做了个测试
1、首先aspx页面能正确的处理XML文档
2、用responseText能得到XML文档的内容
3、XML文档的内容是没有错的,因为我将responseText返回的内容传给loadXml函数,就可以正常的调用getElementsByTagName,并且显示正确的值
我觉得responsexml只所以出错,是因为这个函数根本没有得到xml文件,因为采用load(req.responseXML),提示“文档必须要有一个顶层元素”
另外,我已经把Contenttype设为text/xml了,也不行
Top
15 楼benlao()回复于 2006-10-08 16:55:06 得分 0
resp.getElementsByTagName('data')[0].firstChild.dataTop
16 楼everlily()回复于 2006-10-08 17:18:03 得分 0
呵呵,如果只是访问单独xml文件,那么repsonseXML是不行的。
终于搞明白了。Top
17 楼chaircat(chaircat)回复于 2006-10-08 19:27:35 得分 0
有这回事么??
做个实验先.....Top
18 楼liufei8463(武汉小兵)回复于 2006-10-09 10:32:27 得分 0
我也读不出来啊 !!正是这个问题啊!跟楼主一样的问题 不解!!Top
19 楼wisdomhxz(星尘缥缈)回复于 2006-10-09 16:04:35 得分 0
var data= resp.getElementsByTagName("data")[0].nodeValue;
后面加个.nodeValue;Top
20 楼Eilien(我要成长,我正在成长,)回复于 2006-10-11 15:03:59 得分 0
mark.Top
21 楼sven(想骑马的牛)回复于 2006-10-18 17:41:07 得分 0
和我碰到的问题一样,
我有个index.php的页面,?mode=update时生成一个XML页面(标准的).
用和你的方法差不多的JS访问得到NULL值,
而直接把生成的的页面保存成一个不带参数访问的页面时就可以,如xml.php.
我最后也是用resultText, 然后分responseText.split的方法暂时处理了...Top
22 楼chaircat(chaircat)回复于 2006-10-18 19:38:12 得分 0
lz把XML文件贴出来看看??
我还是觉得XML文件格式有问题...
因为我用MSXML SDK的示例XML文件直接用loadXml()是打不开的...
但是用load()却可以...后面发现原来是XML头部那个声明的问题...
后来乱改改到loadXml()可以打开了...load()又打不开了...Top
23 楼xingzhiyun(八宝齐)回复于 2006-10-18 22:37:35 得分 0
这个问题我也有,所以我对结果的处理都是用response.txt来得到xml结果,感觉有些不好,但是在实际使用中,没有问题,但不知道原因是什么.
好像以java为后台的时候就没有这样的问题,但以.net为后台的时候就出现这样的问题了.
希望高人给解释解释Top
24 楼woshumao0080()回复于 2006-10-19 18:32:10 得分 0
不知道楼主用的是什么浏览器来测试,我现在也正在被这个问题郁闷哪。但是我的代码是在IE6.0中不好用,在fireFox1.5中都能正确显示。Top
25 楼seahi(老七)回复于 2006-10-22 16:57:03 得分 0
我也和楼主遇到同样的问题,不明白是咋回事。Top
26 楼xuzuning(唠叨)回复于 2006-10-23 16:35:12 得分 0
1、确认xml文档是正确的
2、如果载入的xml文件,则必须在web方式下测试
3、如果载入的是程序生成的xml文档,则程序必须先输出类型声明的头
4、由于ie中会缓存接受的数据,调试时要注意清空缓冲区。不然你测试的仍是第一次发生错误时的数据Top
27 楼Eilien(我要成长,我正在成长,)回复于 2006-10-23 18:02:28 得分 0
回复人:everlily() ( ) 信誉:100 2006-10-8 17:18:04 得分:0
?
呵呵,如果只是访问单独xml文件,那么repsonseXML是不行的。
终于搞明白了。??????
难道XML文档里只有一个结点的时候,读不出来,还是怎么的,楼主搞定了,说一说你详细的解决思路啊。Top
28 楼pgy8288(Just Coding)回复于 2006-10-24 12:49:58 得分 0
xuzuning(唠叨) ( ) 信誉:739 Blog 2006-10-23 16:35:00 得分: 0
4、由于ie中会缓存接受的数据,调试时要注意清空缓冲区。不然你测试的仍是第一次发生错误时的数据
这一条很多时候都会忘记,改来改去都没效果
呵呵
Top
29 楼Hozaka(空虚的狼)回复于 2006-10-24 14:58:08 得分 0
var data = resp.getElementsByTagName("data")[0].childNodes[0].nodeValue;
包你行,呵呵。主要是xml模型的节点比较多,用起来麻烦,还是自己封装一个解析类吧Top
30 楼loworth()回复于 2006-10-24 17:40:04 得分 0
var data= resp.getElementsByTagName("data")[0].nodeValue;
你调用的东西不对 掉了元素节点了 应该调用个文本节点Top
31 楼woshumao0080()回复于 2006-10-25 10:45:16 得分 0
1.IE缓冲区怎么清除阿?
2.真没有人碰到过浏览器不兼容的问题么?
我的代码现在在FireFox下,一切正常,包括XML文件的读取和servlet生成的XML对象,而IE中啥啥都不好使Top
32 楼woshumao0080()回复于 2006-10-25 11:38:24 得分 0
嘿嘿,好了,我的好了,
在response中返回xml的时候少了这么一句:
out.println("<?xml version=\"1.0\" encoding=\"gb2312\"?>");
加上就好了。
但是为什么要加呢?setContentType做不到么,为什么在fireFox中就不用呢?
嗷嗷的诡异阿Top
33 楼cfgm(风色幻想)回复于 2006-10-26 01:12:59 得分 0
不是不能单独的xml!问题只有两种,编码问题和文件类型
mixweb.cn里边都是这样用的Top




