+ -
当前位置:首页 → 问答吧 → xmlhttp的responseXML读xml文件为空,为什么?

xmlhttp的responseXML读xml文件为空,为什么?

时间:2005-12-03

来源:互联网

我太菜了,花了一天都没搞定,简直打击我学习的信心,请教
用xmlhttp的responseText读xml文件有内容,用responseXML就为空
xml文件特简单,
<?xml version="1.0" ?>
<root>
<test>
</test>
</root>
就这样也不行
不知道用responseXML读的xml文件有什么要求。

作者: dreamforever   发布时间: 2005-12-03

我以前也遇到这个问题, 我的XML文件是后台自动生成的, 不知道你的是不是.

如果后台生成时没有指定头部信息, 浏览器会把它当html来看, 会出错. 一般后台必须指定头部(PHP语法):
<?php
header("Content-Type: text/xml; charset=gb2312");
?>

作者: 比尔熊   发布时间: 2005-12-04

谢谢你的回复,不过不是这个问题,我今天又试了:
读静态xml文件
同样的程序在tomcat下用responseXML.xml可以读出,在weblogic下读的为空
读动态xml文件(jsp生成)
在tomcat和weblogic下都为空。

作者: dreamforever   发布时间: 2005-12-05

我还试了别的网站下的一个事例程序
原代码:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> AJAX测试页面</TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
<style>
html {background-color:#eeeeee}
body {
      background-color:#ffffff;
      font-family:Tahoma,Arial,Helvetica,sans-serif;
      font-size:12px;
          margin-left:15%;
          margin-right:15%;
          border:3px groove #006600;
          padding:15px
         }
h1   {
      text-align:left;
      font-size:1.5em;
      font-weight:bold
     }
</style>
</HEAD>
<!--code by bugx-->
<BODY>
<script type="text/javascript" language="javascript">
var xmlhttp=false;
//创建XMLHTTP对象,读取指定xml文档

function loadXMLDoc (url)
{
         try {
          xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");  //W3C标准
         } catch (e) {
          try {
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");   //微软标准
          } catch (e) {
           xmlhttp = false;
          }
         }

if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
          xmlhttp = new XMLHttpRequest();
}

                xmlhttp.onreadystatechange = ResponseContents;
        xmlhttp.open('GET', url, true);
        xmlhttp.send(null);
}

//监听数据,
function ResponseContents()
{
        if (xmlhttp.readyState==4)
        {
                if (xmlhttp.status==200)
                {
                        clearlist();
                        buildlist();
                }
                else{
                   alert("XML文档错误:\n"+xmlhttp.statusText);
                }
        }
}

//清除内容
function clearlist() {
    var select = document.getElementById("topics");
    while (select.length > 0) {
        select.remove(0);
    }
}

function getElementTextNS(prefix, local, parentElem, index) {
    var result = "";
    if (prefix ) {
        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
    } else {
      
        result = parentElem.getElementsByTagName(local)[index];
    }
    if (result) {
   
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
            return result.firstChild.nodeValue;                   
        }
    } else {
        return "null";
    }
}

//加入列表框
function appendToSelect(select, value, content) {
    var opt;
    opt = document.createElement("option");
    opt.value = value;
    opt.appendChild(content);
    select.appendChild(opt);
}

//载入列表框
function loadDoc(evt) {
    // equalize W3C/IE event models to get event object
    evt = (evt) ? evt : ((window.event) ? window.event : null);
    if (evt) {
        // equalize W3C/IE models to get event target reference
        var elem = (evt.target) ? evt.target : ((evt.srcElement) ? evt.srcElement : null);
        if (elem) {
            try {
                if (elem.selectedIndex > 0) {
                    loadXMLDoc(elem.options[elem.selectedIndex].value);
                }       
            }
            catch(e) {
                var msg = (typeof e == "string") ? e : ((e.message) ? e.message : "Unknown Error");
                alert("Unable to get XML data:\n" + msg);
                return;
            }
        }
    }
}
//重建内容
function buildlist() {
    var select = document.getElementById("topics");
        alert(xmlhttp.responseXML.getElementsByTagName("rss").length)
    var items = xmlhttp.responseXML.getElementsByTagName("item");
    // 取得XML文件节点
    // <title> element
    for (var i = 0; i < items.length; i++) {
        appendToSelect(select, i,
            document.createTextNode(getElementTextNS("", "title", items[i], 0)));
    }
  
}


</script>

<h1>Ajax Demo</h1>
<hr />

<form>
<p>类别:<br />
<select onchange="loadDoc(event)">
    <option value="">Choose</option>
    <option value="http://blog.nowans.com/feed.asp">nblog</option>
</select>
</p>
</form>
<div id="details"><span></span></div>
</BODY>
</HTML>
我把事例程序放在我的网站下,修改调用的动态xml文件为我的文件也不行,
我的动态xml原文件test.jsp如下:

<%@ page contentType="text/xml"  language="java" import="java.sql.*"%>
<jsp:useBean id="connect" scope="page" class="test.conn"/>
<?xml version="1.0" encoding="utf-8"?>
<all>
<%
String type=request.getParameter("type");
String sql="select * from softwarecode where type='"+type+"'";
ResultSet rs=connect.executeQuery(sql);
while (rs.next()) {
        out.print("<data>");
        out.print("<code>");
        out.print("<![CDATA["+rs.getString("code")+"]]>");
        out.print("</code>");
        out.print("<describe>");
        out.print("<![CDATA["+rs.getString("describe")+"]]>");
        out.print("</describe>");
        out.print("</data>");
        }
rs.close();
out.print("</all>");
connect.finalize();%>
在ie下test.jsp?type=database显示的结果:
<?xml version="1.0" encoding="utf-8" ?><all><data>
<code>
<![CDATA[SOH0101]]>
</code>
<describe>
<![CDATA[SQL Server]]>
</describe></data></all>
不知道哪有问题?

作者: dreamforever   发布时间: 2005-12-05

你的代码, 前后台根本不一致, 能得到返回值那是出鬼了.

作者: 比尔熊   发布时间: 2005-12-05

不好意思,,我已经最简化了
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> AJAX测试页面</TITLE>
</HEAD>
<BODY>
<script type="text/javascript" language="javascript">
var xmlhttp=false;
//创建XMLHTTP对象,读取指定xml文档

function loadXMLDoc ()
{
         try {
          xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");  //W3C标准
         } catch (e) {
          try {
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");   //微软标准
          } catch (e) {
           xmlhttp = false;
          }
         }

if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
          xmlhttp = new XMLHttpRequest();
}

                xmlhttp.onreadystatechange = ResponseContents;
        xmlhttp.open('GET','http://localhost/test.jsp', true);
        xmlhttp.send(null);
}

//监听数据,
function ResponseContents()
{
        if (xmlhttp.readyState==4)
        {
                if (xmlhttp.status==200)
                {
            alert(xmlhttp.responseText);
        alert(xmlhttp.responseXML.xml);
                }
                else{
                   alert("XML文档错误:\n"+xmlhttp.statusText);
                }
        }
}



</script>

<h1>Ajax Demo</h1>
<hr />

<form>
<p>类别:<br />
<select onchange="loadXMLDoc()">
    <option value="">Choose</option>
    <option value="test">test</option>
</select>
</p>
</form>
</BODY>
</HTML>

动态jsp
<%@ page contentType="text/xml"  language="java" import="java.sql.*"%>
<jsp:useBean id="connect" scope="page" class="test.conn"/>
<?xml version="1.0" encoding="utf-8"?>
<all>
<%
String type=request.getParameter("type");
String sql="select * from softwarecode where type='"+type+"'";
ResultSet rs=connect.executeQuery(sql);
while (rs.next()) {
        out.println("<data>");
        out.println("<code>");
        out.println("<![CDATA["+rs.getString("code")+"]]>");
        out.println("</code>");
        out.println("<describe>");
        out.println("<![CDATA["+rs.getString("describe")+"]]>");
        out.println("</describe>");
        out.println("</data>");
        }
rs.close();
out.println("</all>");
connect.finalize();%>
在ie下test.jsp?type=database显示的结果:
<?xml version="1.0" encoding="utf-8" ?>
<all>
<data>
<code>
<![CDATA[SOH0101]]>
</code>
<describe>
<![CDATA[SQL Server]]>
</describe>
</data>
</all>


就是得不到responseXML的内容,如果我把'http://localhost/test.jsp'改为'http://blog.nowans.com/feed.asp'就完全没问题,所以我觉的是我的jsp的问题,但是这个jsp直接执行显示了xml,没有报错。我已经搞糊涂了

作者: dreamforever   发布时间: 2005-12-06

我也碰到了类似问题,responseText返回正确的XML文档内容,responseXML返回空。
xmlHttp.open("GET","file.asp?para=xx",true);

后台我用的是ASP生成XML,楼主这问题后来怎么解决的?

作者: chocolate   发布时间: 2006-10-10

ASP 加上语句 Response.ContentType="text/xml" 解决

作者: chocolate   发布时间: 2006-10-10

呵呵. 这个是常见问题...

一般跟两个东西有关:
1. 输出内容的 编码    2. 输出内容的 格式

asp:  
Response.Charset="utf-8"
Response.ContentType="text/xml"

作者: ※潇洒※   发布时间: 2006-10-11

很奇怪,ActiveXObject还会有W3C标准

[复制]
Code:

try {
          xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");  //W3C标准
         } catch (e) {
          try {
           xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");   //微软标准
          } catch (e) {
           xmlhttp = false;
          } 


作者: Rimifon   发布时间: 2006-10-13