responseXML始终为空。

23

我正在使用Firefox 3.6.10和Firebug进行调试。

这是我的代码:

var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", url,false);
xmlhttp.setRequestHeader('Content-Type',  'text/xml');
xmlhttp.send(null);
alert(xmlhttp.responseXML);
responseXML总是null,我已经尝试了多个不同域的URL,也尝试过异步方式,结果都一样。而responseText则可以正常返回,没有问题。
我的目标是获取responseXML.documentElement。谢谢你的帮助。
编辑-----------
这段JavaScript代码是从一个Greasemonkey用户脚本中执行的,并且我确保它与请求的URL具有相同的源。我还尝试在Firebug控制台中执行,也确保使用了源策略。两者都出现了相同的错误。
讨厌JavaScript。
9个回答

26

除了已经提到的跨域问题外,responseXML 还要求响应来自服务器的完全有效的 XML 数据以及正确设置 Content-Type 响应头信息。很少有普通网站能够同时满足这两个要求。

对于后一个问题,您可以使用

xmlhttp.overrideMimeType('application/xml');

在发送请求之前,可以强制响应被解释为XML格式。但是,如果响应不是有效的XML,那么你将只会得到null


那么,我猜我必须使用正则表达式来获取DOM元素及其属性?这会很痛苦。 - WoF_Angel
由于您在Firefox中使用了特权代码,请查看此页面:https://developer.mozilla.org/en/Code_snippets/HTML_to_DOM - MooGoo
他们用于解析整个HTML文档到DOM的解决方案对我不起作用。我正在使用Greasemonkey,它应该对此有一些影响。无论如何,他们的解决方案很复杂,我可能会再次尝试。我最好开始挖掘正则表达式。 - WoF_Angel
1
很遗憾,在vba中无法执行overrideMimeType。 :( - phoenies
不存在 "text/xml" 这样的东西;这看起来像是尝试设置 MIME 类型,如果是这样,请使用 application/xml - John

26

如果我没记错的话,这是Firefox已知的问题(我以前也遇到过同样的问题)。

解决方法是将responseText解析为XML文档,然后使用它。

类似于以下内容:

var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlhttp.responseText, "application/xml");

MDCDOMParser可用于解析XML文本的字符串和流。它不能用于解析HTML“标记混乱”的文本。但是,该页面上的链接应该指向正确的方向。 - MooGoo
显然,你所尝试读取的内容应该是正确的XML。这是我使用它的情况。不确定在XHTML的情况下会发生什么(虽然它是有效的XML,所以应该可以工作)。 - Kenny
这在之前运行正常的Chrome(32.0.etc.etc)中刚刚出现了。感谢修复。 - graham
这个问题在2016年仍然存在,但是谢谢,这种方法修复了我的页面! - Phantom
现在很有用。我看到使用responseXML的示例似乎属于Web的古老时代。 - Leandro Arruda

8

我敢打赌你正在违反同源策略。

对于XHRs,你必须拥有相同的协议、域名、端口等。因此,如果你在localhost:8080/app上运行一个应用程序,你不能ajax到www.cnn.com。

不同的浏览器处理这个问题的方式不同;我见过FF做你所描述的事情,也就是请求似乎正常返回,但没有数据......


1
这段JavaScript代码是从Greasemonkey用户脚本中执行的,我确保它与请求的URL具有相同的来源。同时,我尝试从Firebug控制台执行,再次确保了源策略。但两者都出现了相同的错误。 - WoF_Angel
你说得对。有一些解决方法,我稍后可以检查一下。 - WoF_Angel

6
尝试直接在浏览器中打开url的值,您应该会看到一些错误信息。
如果出现解析错误,则很可能是您的编码有误,并且您的XML中存在使其无效的特殊字符。

为避免这种情况,您需要确保所有链都被正确编码。

如果是静态XML文件,则需要在保存时正确设置编辑器编码。几乎可以胜任所有任务的编码是UTF-8,通常是您可以在编辑器设置或保存对话框中选择的属性。

如果是动态生成的,则您的数据、页面和服务器响应也必须正确编码。而您的XML应以<?xml version="1.0" encoding="UTF-8"?>开头。

您可以先尝试使用非常基本和静态的XML:

<?xml version="1.0" encoding="UTF-8"?><root>hi</root>

然后逐步添加步骤,使其与您的相似,而不破坏它。


我完全无法访问服务器,这应该是一个Greasemonkey脚本。 - WoF_Angel
尝试在本地主机上使用上述基本XML,以查看您的脚本是否有效。然后直接在浏览器的地址栏中键入其他服务器URL,以查看发生了什么。然后尝试获取从服务器接收到的XML的编码...我记得花费了数小时让SAP生成一个XML文档而不是字符串,直到我弄清楚这是关于编码的问题。祝你好运! - Mic

1

我花了几个小时玩弄这个,最终找到了那个让我烦恼的小错误...

如果您和我一样,喜欢将JavaScript代码放在外部“.js”文件中。

因此,使用xmlhttp.open("GET","yourxmlfile.xml",false)将始终相对于HTML文档搜索XML文件,即使代码位于外部JavaScript文件中。

如果responseText返回null,则指定路径位置中找不到本地文件。如果async设置为true,则将创建文件,响应文本将携带空XML文档的内容。

示例:

xmlDoc = xmlhttp.responseText; //字符串数据类型

        or

xmlDoc = xmlhttp.responseXML; //XML数据类型

  • folder1 = folder2,index.html。
  • folder2 = index.js,yourxmlfile.xml。
  • 从HTML到XML的路径为“folder2/yourxmlfile.xml”,而不是“yourxmlfile.xml”。

记得在打开和发送请求之前将XML文档解析为“text/xml”。

例如:

  • xhttp.overrideMimeType('text/xml');
  • Chrome:xmlDoc = (new DOMParser()).parseFromString(xmlDoc,"text/xml");

1
对我来说,这是一个简单的问题。我的xml/php文件中有语法错误。当我在浏览器中查看文件时,浏览器没有检测到任何错误。
确保XML文档中的元素正确关闭!

是的,“服务器”返回的XML必须是正确的格式,否则XML响应将为空。我的标签上有双重属性,导致失败。我的XML中有一个“&”符号,也导致失败。 - Kristian

1
任何形式的格式不正确的XML都会引起这个问题。例如,我有一个没有“something”属性的“renderer”属性,这是无效的,会导致“DOMParser”(由“XMLHTTPRequest”调用)无法解析。因此,“load”事件将包含文本响应但不是XML。

1

我刚刚遇到了同样的问题。

var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", url,false);
xmlhttp.setRequestHeader('Content-Type',  'text/xml');

xmlhttp.responseType = "document";

xmlhttp.send(null);
alert(xmlhttp.responseXML);

在您的代码中添加responseType“document”行以解决此问题。放在open和send方法之间。
参考:(请参见用法https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/HTML_in_XMLHttpRequest

0

我曾经花了很长时间才找到一个正确的XML示例。如果你得到了null,请尝试使用XML验证器。对我来说,<root>元素是缺失的。

<root>
<info><p>Array
(
)
</p>
</info>
<itemData>{"id":"40","client_id":"1","nameUnique":"Lore ipsum","description":null,"userComment":null,"last_modified":"2018-12-15 02:48:57"}    </itemData>
</root>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接