2016-06-08 4 views
11

Я пытаюсь создать приложение погоды, отображающее погоду и температуру многих дней недели. В настоящее время я использую openweathermap api для такой задачи, дело в том, что информация, которую я хочу (то есть дата погоды), поступает только в формате xml. Так как я восстанавливаю его в ES6 (ES2015) по академическим причинам, я хотел также использовать apetch fetch, но поскольку метод выборки анализирует его, он просто доставляет ошибку. , так как я могу получить его или у вас есть лучший способ сделать это.Как получить XML с помощью fetch api

let apis = { 
    currentWeather: { //get user selected recomendation weather 
     api:"http://api.openweathermap.org/data/2.5/forecast/daily?lat=", 
     parameters: "&mode=xml&units=metric&cnt=6&APPID=/*api key*/", 
     url: (lat, lon) => { 
      return apis.currentWeather.api + lat + "&lon=" + lon + 
        apis.currentWeather.parameters 
     } 
    } 
}; 
function getCurrentLoc() { 
    return new Promise((resolve, reject) => navigator.geolocation 
              .getCurrentPosition(resolve, reject)) 
} 
function getCurrentCity(location) { 
    const lat = location.coords.latitude; 
    const lon = location.coords.longitude; 
    return fetch(apis.currentWeather.url(lat, lon)) 
    .then(response => response.json()) 
    .then(data => console.log(data)) 
} 
getCurrentLoc() 
.then(coords => getCurrentCity(coords)) 

ответ

7

Я предполагаю, что ошибка исходит от этой функции: response => response.json(), так как реакция не является допустимым объект JSON (это XML).

Насколько я знаю, нет собственного синтаксического анализатора XML для fetch, но вы можете обрабатывать ответ как текст и использовать сторонний инструмент для фактического разбора, например jQuery имеет функцию $.parseXML().

Это будет выглядеть примерно так:

function getCurrentCity(location) { 
    const lat = location.coords.latitude; 
    const lon = location.coords.longitude; 
    return fetch(apis.currentWeather.url(lat, lon)) 
     .then(response => response.text()) 
     .then(xmlString => $.parseXML(xmlString)) 
     .then(data => console.log(data)) 
} 
+3

Я могу подтвердить, что нет родной XML парсер выборки. См. Https://developer.mozilla.org/en-US/docs/Web/API/Response#Methods. – Marco

13

Использование родного DOMParser getCurrentCity (расположение) можно записать:

function getCurrentCity(location) { 
 
    const lat = location.coords.latitude; 
 
    const lon = location.coords.longitude; 
 
    return fetch(apis.currentWeather.url(lat, lon)) 
 
     .then(response => response.text()) 
 
     .then(str => (new window.DOMParser()).parseFromString(str, "text/xml")) 
 
     .then(data => console.log(data)) 
 
}

Смежные вопросы