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

时间:2012-02-27 15:38:35

标签: javascript jquery xml dom

我有一个由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 = $('<?xml version="1.0"?><root><element>bla</element><element>blubb</element></root>');
$xml.find("element").each(function() {
    alert($(this).text());
});
out = new XMLSerializer().serializeToString($xml);

即使没有任何网络服务电话,问题仍然存在。 (警报正确输出内容)

编辑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);

3 个答案:

答案 0 :(得分:1)

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

如果它确实是跨域请求,则需要实现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文档吗?

答案 1 :(得分:0)

您不需要解析输出,因为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
    }
});

答案 2 :(得分:0)

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

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

IE中也没有XMLSerializer可用&lt; 9.对于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 "";
};