JavaScript、JSONP和从跨域读取XML

JavaScript、JSONP和从跨域读取XML,javascript,xml,json,cross-domain,jsonp,Javascript,Xml,Json,Cross Domain,Jsonp,在我的JS项目中,我需要从跨域加载数据。(JavaScript位于域A上,数据来自域B) 我有一个使用XML的解决方案,但我确实需要加载一个XML(普通的XML音乐播放列表)。主要目标是能够加载和解析XML数据,而无需首先将其修改为其他格式(如JSONP) 这完全不可能吗?或者是否有任何解决方法或黑客? 我的目标主要是iOS上的最新浏览器 谢谢 附言:有什么帮助吗?或者它与XML无关 更新:不幸的是,我不能使用代理,我真的在问一个直接的解决方案 通常的解决方案是使用一个“AJAX代理”——一个在

在我的JS项目中,我需要从跨域加载数据。(JavaScript位于域A上,数据来自域B)

我有一个使用XML的解决方案,但我确实需要加载一个XML(普通的XML音乐播放列表)。主要目标是能够加载和解析XML数据,而无需首先将其修改为其他格式(如JSONP)

这完全不可能吗?或者是否有任何解决方法或黑客?

我的目标主要是iOS上的最新浏览器

谢谢

附言:有什么帮助吗?或者它与XML无关


更新:不幸的是,我不能使用代理,我真的在问一个直接的解决方案

通常的解决方案是使用一个“AJAX代理”——一个在您的域上运行的简单服务器端脚本,它从另一个域获取数据并返回不变的数据

简单列表是为脚本提供您需要的数据来源URL:

http://example.com/proxy.php?url=http%3A%2F%2Fexample.org%2Fajax%3Fid%3D123
http://example.org/ajax?id=123

但是,如果您让任何URL像这样被获取,那么这可能会被误用,因此您应该有您的脚本,检查它是否实际上只从特定URL获取数据

为了避免必须解析URL才能进行检查,您可以为您的应用程序编写特定的代理,该代理仅访问您需要的特定资源:


http://example.com/proxy.php?id=123
访问
http://example.org/ajax?id=123

如果您有一个JSON-p解决方案,您可以将XML作为字符串传递给JSON-p回调。然后你可以这样做,你完全可以这样做,只需让你的域B返回

func("<myxml></myxml>");
func(“”);

var someVar=”“;
名称JSONP实际上与JSON没有任何关系,因为它的概念都是关于执行将数据嵌入代码中的JavaScript

一旦您的域B恰好返回上述两种表单中的一种,域A就可以通过以下方式使用它:

<script>
function func(xmlString) {
    alert(xmlString); // you can parse the xmlString with 
                      // jQuery or something else
}
</script>

函数func(xmlString){
alert(xmlString);//您可以使用
//jQuery还是其他什么
}
或者,如果使用第二个示例:

<script>
alert(someVar);
</script>

警报(someVar);

JSONP的整体思想是响应必须作为脚本执行。因此,只要XML数据是有效的Javascript,您就可以将其传回—例如,服务器可以将其响应包装为字符串:

myCallback('<xml><stuff/></xml>')

这假设您控制另一台服务器和/或有兴趣以这种方式格式化其数据的人。否则,您就不走运了,需要某种类型的代理—您可能能够做到。

服务器端需要什么?XML是否可以打包为JSONP回调“即时”?假设您的服务器在一个名为“XML”的变量中有XML响应,JSON-P回调的名称是“回调”。然后,您的服务器必须执行以下操作(这是伪代码):
printcallback+“('”+escapeForJs(serializeXmlToString(xml))+“;”Luca Mattis的回答也包括这一点。谢谢你的建议,很遗憾我不能使用代理,我真的想知道是否有直接的解决方案。我会更新这个问题。easyXDM肯定会有所帮助-你看过演示吗?正是我所想的,非常感谢你的澄清。我明天会选的。因为我必须等待9分钟…:)我想服务器管理员更喜欢发送json对象而不是xml。。。只是因为大小??有很多理由将服务器响应格式化为JSON-大小是其中之一,但它也更容易用多种语言生成,而且,正如这个问题所示,JSON也是有效的Javascript代码,因此它可以很容易地在JSONP请求中使用你的意思是,在我得到响应后,我不必像分析XML一样分析对象。我可以把它当作普通的JS对象使用。。。这就是你的意思吗?我的意思是它不需要任何后期处理。如果以字符串形式发送XML(如我的回答中所示),则需要对其进行解析,以便在Javascript中使用。如果服务器使用JSON响应,例如
回调({“success”:1})
,则它已经是有效的Javascript,无需解析。
myCallback('<xml><stuff/></xml>')
success: function(data) { 
    var xml = $(data); // now do stuff 
}