2011-02-12 86 views
0

我想在Android应用程序中使用Google的非官方天气API。以Java获取XML文件的问题

我用这个代码:

//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文件,所以我做错了什么?

回答

1

这完美的工作对我来说:

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> 
+0

这看起来不错,但我使用JDOM,而不是dom4j所以没有SAXREADER ...什么是使用JDOM的等效过程? – 2011-02-14 18:22:42

3

我认为你需要打开与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

你能够成功地检索其他的URI?

您可能会遇到JVM配置问题。在我遇到的大多数环境中,如果您的计算机已配置为使Web浏览器可以成功地发出HTTP请求,那么Java也将能够成功完成它们。但是我听说当你在代理服务器后面需要特殊的JVM配置时,我不知道在Android环境中是否需要类似的东西。

1

我遇到了JDOM2的这个问题,它确实是一个伪装的NetworkOnMainThreadException。把它从主线程中抛出,一切正常。

new Thread(new Runnable() { 
      @Override 
      public void run() { 
       <your code> 
      } 
     }).start();