Проблема при загрузке XML-файла в Java - PullRequest
0 голосов
/ 13 февраля 2011

Я пытаюсь использовать неофициальный погодный API Google в приложении для Android.

Я использую этот код:

//get the text from the edit text
    userZip = zipCode.getText().toString();
    //create a link using the zip code
    //TODO sanitize input
    System.out.println(userZip);
    link = "http://www.google.com/ig/api?weather=" + userZip;
    System.out.println(link);
    //connect to the link
    URL googleWeatherService = null;
    try {
        googleWeatherService = new URL(link);
    } catch (MalformedURLException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } 
    SAXBuilder parser = new SAXBuilder();
    try {
        doc = parser.build(googleWeatherService);
    } catch (JDOMException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Но я получаю ошибку java.io.IOException Не удалось открыть http://www.google.com/ig/api?weather=08003 (просто используя 08003 в качестве примера).

Если вы перейдете по ссылке в FF, вы получите хороший XML-файл погоды, так что я делаю не так?

Ответы [ 4 ]

3 голосов
/ 13 февраля 2011

Я думаю, вам нужно открыть соединение с URL-адресом и получить входной поток, чтобы это работало. Я бы попробовал это:

 URL googleWeatherService = null;
 URLConnection conn = null;
try {
    googleWeatherService = new URL(link);
    conn = googleWeatherService.openConnection();
} catch (MalformedURLException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
} 
SAXBuilder parser = new SAXBuilder();
try {
    doc = parser.build(conn.getInputStream());

Надеюсь, это поможет вам!

В противном случае, если это не сработает, похоже, что вам приходится иметь дело с переадресацией URL, что является проблемой, с которой я сталкивался. В этом случае вам нужно будет сделать следующее:

 URL googleWeatherService = null;
 URLConnection conn = null;
try {
googleWeatherService = new URL(link);
HttpURLConnection ucon = (HttpURLConnection) googleWeatherService.openConnection();
ucon.setInstanceFollowRedirects(false);
URL secondURL = new URL(ucon.getHeaderField("Location"));
conn = secondURL.openConnection();
} catch (MalformedURLException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
} 
SAXBuilder parser = new SAXBuilder();
try {
    doc = parser.build(conn.getInputStream());

Надеюсь, это решит!

1 голос
/ 08 июня 2015

Я столкнулся с этой проблемой с JDOM2, и это было действительно скрытое исключение NetworkOnMainThreadException.Скинул с основного потока и все заработало.

new Thread(new Runnable() {
            @Override
            public void run() {
                <your code>
            }
        }).start();
1 голос
/ 13 февраля 2011

Вы можете успешно получить другие URI?

Возможно, у вас проблемы с конфигурацией JVM. В большинстве сред, с которыми я сталкивался, если ваш компьютер настроен так, что веб-браузер может успешно выполнять HTTP-запросы, то Java также сможет их успешно выполнять. Но я слышал о необходимости специальной конфигурации JVM, когда вы находитесь за прокси-сервером, и я не знаю, может ли быть что-то подобное в среде Android.

1 голос
/ 13 февраля 2011

Это прекрасно сработало для меня:

package weather;

import org.dom4j.Document;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

/**
 * GoogleWeather
 * @author Michael
 * @since 2/12/11
 */
public class GoogleWeather
{

    public static void main(String[] args)
    {
        for (String userZip : args)
        {
            BufferedReader br = null;
            try
            {
                String link = "http://www.google.com/ig/api?weather=" + userZip;
                System.out.println(link);
                URL googleWeatherService = new URL(link);
                br = new BufferedReader(new InputStreamReader(googleWeatherService.openStream()));
                SAXReader reader = new SAXReader();
                Document document = reader.read(googleWeatherService);
                OutputFormat format = OutputFormat.createPrettyPrint();
                XMLWriter writer = new XMLWriter(System.out, format);
                writer.write(document);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                close(br);
            }
        }
    }

    private static void close(BufferedReader br)
    {
        try
        {
            if (br != null)
            {
                br.close();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

Вот результат, который он вернул:

<?xml version="1.0" encoding="UTF-8"?>

<xml_api_reply version="1">
  <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0">
    <forecast_information>
      <city data="Hebron, CT"/>
      <postal_code data="06248"/>
      <latitude_e6 data=""/>
      <longitude_e6 data=""/>
      <forecast_date data="2011-02-12"/>
      <current_date_time data="2011-02-13 03:00:47 +0000"/>
      <unit_system data="US"/>
    </forecast_information>
    <current_conditions>
      <condition data="Partly Cloudy"/>
      <temp_f data="28"/>
      <temp_c data="-2"/>
      <humidity data="Humidity: 45%"/>
      <icon data="/ig/images/weather/partly_cloudy.gif"/>
      <wind_condition data="Wind: NW at 14 mph"/>
    </current_conditions>
    <forecast_conditions>
      <day_of_week data="Sat"/>
      <low data="16"/>
      <high data="36"/>
      <icon data="/ig/images/weather/partly_cloudy.gif"/>
      <condition data="Partly Cloudy"/>
    </forecast_conditions>
    <forecast_conditions>
      <day_of_week data="Sun"/>
      <low data="30"/>
      <high data="38"/>
      <icon data="/ig/images/weather/snow.gif"/>
      <condition data="Snow Showers"/>
    </forecast_conditions>
    <forecast_conditions>
      <day_of_week data="Mon"/>
      <low data="23"/>
      <high data="46"/>
      <icon data="/ig/images/weather/cloudy.gif"/>
      <condition data="Cloudy"/>
    </forecast_conditions>
    <forecast_conditions>
      <day_of_week data="Tue"/>
      <low data="12"/>
      <high data="29"/>
      <icon data="/ig/images/weather/cloudy.gif"/>
      <condition data="Windy"/>
    </forecast_conditions>
  </weather>
</xml_api_reply>
...