有没有办法在 jQuery 中获取类似 JSONP 的 XML 获取?
Posted
技术标签:
【中文标题】有没有办法在 jQuery 中获取类似 JSONP 的 XML 获取?【英文标题】:Is there a way to get JSONP-like fetching of XML in jQuery? 【发布时间】:2011-02-09 21:33:57 【问题描述】:对于我正在开发的 Web 服务,我希望我的嵌入式代码(在客户端的站点上)从位于我的域中的服务器脚本中获取 XML 文件。
由于这是一个跨域请求,我想使用 JSONP,因为它似乎是此类 API 的事实标准。但是,对于我的应用程序,使用 XML 代替 JSON 会更容易。现在,我当然可以在服务器上将我的 XML 转换为 JSON,然后在客户端的站点 javascript 中再转换回 XML,但这似乎不必要地麻烦。我真正需要的是 XMLP 解决方案,带填充的 XML。
我厌倦了谷歌搜索,但找不到这样做的解决方案。有谁知道一个简单的解决方案?
【问题讨论】:
【参考方案1】:json 起作用的唯一原因是页面中包含的 javascript 可以在窗口中运行而不会出现任何 x 域问题。所以它必须保持javascript。但是,您可以缩小 xml,确保它已正确转义并将其作为 json 对象中的值发送。
echo 'callback(data: "' + xml string + '");';
或者类似的东西。
【讨论】:
谢谢!这似乎只是我希望的那种简单的解决方案。我还没有尝试过,但是除了转义部分,我没有预见到任何困难。【参考方案2】:您可以使用Yahoo! Query Language (YQL) 之类的东西来避免为您的 XML 文件编写另一种输出格式。
例如,要通过 JSONP-X 获取此问题的 XML 提要,您可以使用 YQL 查询 URL,例如:
http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20xml%20where%20url%3D%27http%3A%2F%2F***.com%2Ffeeds%2Fquestion%2F2671143%27%20and%20itemPath%3D%27feed.entry%27&callback=my_jsonpx_handler
[Try this query in the YQL console]
这会给你如下结果;有效地将 XML 包装在 JSON 回调中:
my_jsonpx_handler("query":…,"results":["<entry xmlns=\"http://www.w3.org/2005/Atom\">\n <id>http://***.com/questions/2671143/is-there-an-existing-tool-for-jsonp-like-fetching-of-xml-in-jquery<\/id>\n <re:rank xmlns:re=\"http://purl.org/atompub/rank/1.0\" scheme=\"http://***.com\">0<\/re:rank>…"]);
然后,您的小部件可以查询 YQL URL 以获取它们的数据,然后这些数据将与您服务器上的 XML 文件通信(缓存、速度等作为附加的好处)。
【讨论】:
感谢您提供详细而有用的建议。不过,Alex 的建议似乎更简单一些,我非常喜欢。【参考方案3】:从 jQuery 1.5 开始,有一个实用方法,它挽救了我使用 jsonp 加载 XML 的生命。
var xml = "<rss version='2.0'><channel><title>RSS Title</title></channel></rss>",
xmlDoc = $.parseXML( xml ),
$xml = $( xmlDoc ),
$title = $xml.find( "title" );
http://api.jquery.com/jQuery.parseXML/
【讨论】:
谢谢,我最终还是使用了 JSON,但我确信您的回答可能对其他人最有用。 您仍然必须将 XML 响应包装在 JSONP“包”中,对吧? 是的,您需要将响应打包到 JSONP 调用的函数中,但这只是说明如何解析响应的 XML 内容。以上是关于有没有办法在 jQuery 中获取类似 JSONP 的 XML 获取?的主要内容,如果未能解决你的问题,请参考以下文章
使用 jQuery 1.5 将请求作为 jsonp 发送,将响应解释为文本
JQuery - $.ajax() - 使用 JSONP 的跨域 - 仅在 IE 8 中获取“解析器错误”(在 IE 7 中工作)