从jQuery XML Object转换为String会引发安全性错误

我有一个来自REST Web服务响应的jQuery生成的XML对象:

$.ajax({ type: "GET", url: "http://localhost:9299/foo", success:function(xml) { xmlDoc = $.parseXML(xml); $xml = $(xmlDoc); // The rest of the code manipulates the structure of the XML } }); 

现在我需要将更改的XML对象输出为String。 我已经为Firefox和其他浏览器找到了这个解决方案:

 out = new XMLSerializer().serializeToString($xml); 

但我得到的是以下错误消息:

 [Exception... "Security error" code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)" location: "http://localhost/bar"] 

我需要的所有文件都在localhost上(包括为我提供XML和jQuery库的webservice)

任何想法都将受到高度赞赏

编辑:

我已经简化了问题并尝试了以下代码:

 $xml = $('blablubb'); $xml.find("element").each(function() { alert($(this).text()); }); out = new XMLSerializer().serializeToString($xml); 

即使没有任何web服务调用,问题仍然是相同的。 (警报正确输出内容)

编辑2:

感谢Kevin B的评论,我有一个有效的解决方案:

 $.ajax({ type: "GET", url: "http://localhost:9299/foo", dataType: 'xml', success:function(xml) { var $xml = $(xml); // The rest of the code manipulates the structure of the XML } }); 

最后一行不会改变:

 out = new XMLSerializer().serializeToString($xml); 

首先,我无法根据您的代码确认/拒绝这是否是跨域请求。 跨域是指外部文件的端口号,域或协议与请求外部文件的端口号,域或协议不同。

如果它确实是跨域请求,则需要实现CORS或服务器端代理来为您请求它。

其次,您不需要使用$.parseXML() 。 试试这个:

 $.ajax({ type: "GET", url: "/foo", dataType: "xml", success:function(xml) { var $xml = $(xml); // The rest of the code manipulates the structure of the XML } }); 

XML也必须有效才能在所有浏览器中使用。

编辑:所以,这不是一个跨域问题,它不是一个jquery问题。 这里有一些调试: http : //jsfiddle.net/RKpua/我在那里使用了一个非常简单的xml文档,你可以用你的xml替换简单的xml文档吗?

您不需要解析输出,因为jQuery推断它。 在任何情况下,您都可以指定dataType。

 $.ajax({ type: "GET", url: "http://localhost:9299/foo", dataType: "xml", success:function(xml) { $xml = $(xmlDoc); // The rest of the code manipulates the structure of the XML } }); 

您需要通过指定jquery对象中的第一个元素来访问jQuery对象的xml dom属性。

 out = new XMLSerializer().serializeToString($xml[0]); 

IE <9中也没有XMLSerializer。对于IE8,请使用以下内容

 out = $xml[0].xml; 

或者作为jquery扩展

 $.fn.xml2string = function(){ if (window.XMLSerializer) { return (new XMLSerializer()).serializeToString(this[0]); } else if (typeof this[0].xml != "undefined") { return this[0].xml; } return ""; };