Problem fetching XML file in Java

前端 未结 4 1111
感情败类
感情败类 2021-01-07 13:29

I am trying to use Google\'s unofficial weather API in an Android Application.

I use this code:

//get the text from the edit text
    userZip = zipCo         


        
相关标签:
4条回答
  • 2021-01-07 14:07

    This worked perfectly for me:

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

    Here's the result it brought back:

    <?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>
    
    0 讨论(0)
  • 2021-01-07 14:17

    Are you able to retrieve other URIs successfully?

    You could be hitting problems with the JVM configuration. In most environments I've come across, if your machine is configured so that the web browser can make HTTP requests successfully, then Java will also be able to make them successfully. But I've heard of special JVM configuration being needed when you're behind a proxy server, and I've no idea whether anything similar might be needed in an Android environment.

    0 讨论(0)
  • 2021-01-07 14:29

    I've ran into this problem with JDOM2 and it was really a NetworkOnMainThreadException in disguise. Threw it off the main thread and everything worked.

    new Thread(new Runnable() {
                @Override
                public void run() {
                    <your code>
                }
            }).start();
    
    0 讨论(0)
  • 2021-01-07 14:30

    I think you need to open the connection with the url and get the inputstream for this to work. I would try this:

     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());
    

    Hopefully this does the trick for you!

    Otherwise if this fails, it sounds like you're having to deal with URL redirects, which is a problem i used to have. You would need to do the following in that case:

     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());
    

    Hope this solves it!

    0 讨论(0)
提交回复
热议问题