使用jQuery解析跨域xml的问题

时间:2014-03-07 19:16:19

标签: javascript jquery xml crossdomain.xml

我在SO上找到了一个用于检索跨域xml文件的解决方案,但是我无法解析返回的数据。我还需要在此设置超时功能以保持刷新 - 这是价格/凭证数据。

//the remote xml
site = 'http://ec2-54-201-216-39.us-west-2.compute.amazonaws.com/testb/WebService.asmx/GetTickerFromBtcE';
var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from xml where url="' + site + '"') + '&format=xml&callback=?';

$.getJSON(yql, function (data) {
    var xml = $.parseXML(data.results[0]),
        xmlDoc = $.parseXML( xml ),
        $xml = $( xmlDoc ),
        $price = $xml.find( "Currency Value");
        $( "#data" ).append( $price.text() );
    console.log(xml);
});

一个简单的fiddle is here

它出现在#document下的控制台中,作为一个字符串,我不知道这是否正确。它看起来像是一个问题,以及标签名称中有空格,例如“BuyPrice Value”

我已经在这里阅读了其他几个问题,不幸的是我不认为后端开发人员会在jsonp中提供,这将减轻很多这个问题。另外,每隔XX分钟刷新一次的最佳方法是什么?非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

首先,您必须处理xml文档中包含xml文档的事实。

var xml = $.parseXML(data.results[0]),
    xmlDoc = $.parseXML( $(xml).find("string").text() ),

然后你想获得Currency节点的Value属性。

    $xml = $( xmlDoc ),
    $price = $xml.find("Currency");
$( "#data" ).append( $price.attr("Value") );

最终结果:

var xml = $.parseXML(data.results[0]),
    xmlDoc = $.parseXML( $(xml).find("string").text() ),
    $xml = $( xmlDoc ),
    $price = $xml.find("Currency");
$( "#data" ).append( $price.attr("Value") );

http://jsfiddle.net/F52a5/1/

两种刷新方式:

site = 'http://ec2-54-201-216-39.us-west-2.compute.amazonaws.com/testb/WebService.asmx/GetTickerFromBtcE';
var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from xml where url="' + site + '"') + '&format=xml&callback=?';
setInterval(function(){
    $.getJSON(yql, function (data) {
        var xml = $.parseXML(data.results[0]),
            xmlDoc = $.parseXML($(xml).find("string").text()),
            $xml = $(xmlDoc),
            $price = $xml.find("Currency");
        $("#data").append($price.attr("Value"));
    });
},30*1000);

或者,首选方法:

site = 'http://ec2-54-201-216-39.us-west-2.compute.amazonaws.com/testb/WebService.asmx/GetTickerFromBtcE';
var yql = 'http://query.yahooapis.com/v1/public/yql?q=' + encodeURIComponent('select * from xml where url="' + site + '"') + '&format=xml&callback=?';
function getNewData() {
    $.getJSON(yql, function (data) {
        var xml = $.parseXML(data.results[0]),
            xmlDoc = $.parseXML($(xml).find("string").text()),
            $xml = $(xmlDoc),
            $price = $xml.find("Currency");
        $("#data").append($price.attr("Value"));
        setTimeout(getNewData,30*1000);
    });
}
getNewData();