将jQuery XML对象转换为字符串时出现安全错误

3
我有一个XML对象,是由jQuery从REST Web服务的响应中生成的:
$.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对象输出为字符串。我已经为Firefox和其他浏览器找到了此解决方案:
out = new XMLSerializer().serializeToString($xml);

但我在这里遇到的问题是以下错误信息:
[Exception... "Security error"  code: "1000" nsresult: "0x805303e8 (NS_ERROR_DOM_SECURITY_ERR)"  location: "http://localhost/bar"]

我需要的所有文件都在本地(包括为我提供XML的Web服务和jQuery库)。

任何想法将不胜感激。

编辑:

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

$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);

即使没有任何webservice调用,问题仍然存在。(警告正确输出内容)

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

1
关于您最近的编辑。您没有将其解析为XML。http://jsfiddle.net/RKpua/7/ - Kevin B
1
如果您像我的答案一样设置了dataType: "xml", 您就不需要使用$.parseXML() - Kevin B
3个回答

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替换它吗?


谢谢,包含$.parseXML()的那一行确实是不必要的。不幸的是,它仍然无法工作。正如你所提到的,我的Webservice端口号实际上与我使用jquery的接口不同。但这不应该有影响,因为我将数据保存在本地变量xml中,之后只是引用它,或者我错了吗?而且其他所需文件(如jquery库)都在同一服务器(和端口)上可用。 - Velarion
如果像你所建议的那样是跨域的话,除非你实现CORS或使用服务器端代理脚本来请求它,否则将无法使用JavaScript请求它。http://en.wikipedia.org/wiki/Cross-origin_resource_sharing - Kevin B
但是我已经能够加载webservice响应并更改/输出其DOM的不同部分(在相应的对象中)。为什么这个可以工作,而从本地对象转换为普通字符串不行呢? - Velarion
你可能已经实现了CORS,如果没有的话,在那之前就会失败了。 - Kevin B
现在我已经简化了问题 - 但是没有成功。(请查看我帖子中的编辑) - Velarion

0

你不需要解析输出,因为jQuery可以推断它。无论如何,你可以指定数据类型。

$.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
    }
});

0
您需要通过指定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 "";
};

IE8зӨәдҫӢдҪҝз”ЁеҮҪж•°xml()пјҢиҖҢxml2stringеҮҪж•°дҪҝз”ЁеұһжҖ§xmlгҖӮиҝҷдёӨз§Қжғ…еҶөдёӢдёҚеә”иҜҘйғҪжҳҜеұһжҖ§еҗ—пјҹпјҲжҲ–иҖ…еңЁдёӨз§Қжғ…еҶөдёӢйғҪжҳҜеҮҪж•°пјҹпјү - Alexis Wilke
你是对的。在IE8中,xml是XML节点的一个属性。它不应该有括号。回答已更新。 - Matt

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