Проблемы разбора междоменного XML с помощью jQuery

0

Я нашел решение здесь на SO для извлечения файлов xml кросс-домена, однако я не могу проанализировать возвращенные данные. Мне также нужно установить функцию тайм-аута на этом, чтобы она была освежающей - это данные цены /voulume.

//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);
});

здесь есть простая скрипка

он появляется в консоли под # документом, как строка, я не знаю, правильно это или нет. Он считает, что это может быть проблемой, а также имена тегов, в которых есть пробелы, например "Value BuyPrice",

Здесь я прочитал несколько других вопросов, и, к сожалению, я не думаю, что разработчик back-end будет поставлять jsonp, что облегчит это. Кроме того, какой был бы лучший способ обновить его каждые 20 минут? Любые советы высоко ценится.

  • 1
    Ваш xml содержит xml, поэтому вам придется сначала проанализировать xml-оболочку, а затем проанализировать содержащуюся в нем строку xml.
  • 0
    Я думал, что jQuery $ .parseXML сделал это?
Показать ещё 2 комментария
Теги:
crossdomain.xml

1 ответ

1
Лучший ответ

Во-первых, вы должны иметь дело с тем фактом, что у вас есть xml-документ внутри вашего XML-документа.

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

Затем вы хотите получить атрибут Value Currency Currency.

    $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();
  • 0
    Как обычно, это круто. Спасибо чувак. Не могли бы вы просто обернуть все это в функцию и вызвать setTimeout, чтобы он обновился?
  • 0
    Да, просто не делайте тайм-аут слишком коротким. Я не пошел бы меньше, чем 30 секунд
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню