无法使用ajax从xml文件获取数据对象

时间:2015-11-09 22:17:25

标签: javascript ajax xml

我无法弄清楚我对此做错了什么。它在另一个页面上对我有用,但它不适用于此页面(capitalbikeshare)。 '数据'变量确实包含一个对象,但是当我尝试打印出长度或特定项时,它会给我一个错误信息,说它无法读取null" feed'的属性。我究竟做错了什么?

animation: animation 1.5s infinite alternate;

以下是XML文件的一小部分示例。

$.ajax({ 
    url:'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&callback=?&q=' + encodeURIComponent('https://www.capitalbikeshare.com/data/stations/bikeStations.xml'),
    dataType : 'jsonp',
    success: function (data) {
        var entry = data.responseData.feed.entries;
        var entry_length = entry.length;
        alert("success"+entry_length);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        alert("fail");
    }
});

2 个答案:

答案 0 :(得分:1)

该Web服务旨在解析rss提要而非任意XML。

正确的AJAX通话

$.ajax({ 
    url: 'http://ajax.googleapis.com/ajax/services/feed/load',
    dataType : 'jsonp',
    data: {
        v: "1.0",
        num: 10,
        q: 'https://www.capitalbikeshare.com/data/stations/bikeStations.xml'
    },
    success: function (data) {
        console.log(data);
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.error(textStatus);
    }
});

回应
{
    "responseData": null,
    "responseDetails": "Feed could not be loaded.",
    "responseStatus": 400
}

尝试data.responseData.feed.entries,如果feedresponseData,您显然无法访问null

如果您使用其他Web服务,例如cors.io,则可以加载xml,然后使用jQuery访问字段,而不是加载JSON。

$.ajax({
    url: 'http://cors.io',
    dataType : 'xml',
    data: {
        u: 'https://www.capitalbikeshare.com/data/stations/bikeStations.xml'
    },
    success: function (data) {
        console.log(data);
        $(data).find(">stations>station>name").each(function(){
            console.log($(this).text());
        });
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.error(textStatus);
    }
});

答案 1 :(得分:0)

您可能希望使用JSON.stringify()api从AJAX中转储所获取数据的内容,以查看该属性是否确实存在。

success: function (data) {
    console.log('Dumping data object -> ' + JSON.stringify(data, null, 4));
}

如果您使用的是chrome,则可以通过“ ctrl + shift + j ”访问控制台输出面板。