java - 使用 Java 从 google Weather API 中提取数据

标签 java api weather

编辑:2020 年更新 - 请忽略以下问题,因为 Google 的天气 API 不再可用。如果您对使用天气 API 感兴趣,Darksky 是大多数人使用的事实:https://darksky.net/dev

如果您使用 Java,解析 JSON 的正常方法是使用 org.json: https://devqa.io/java/how-to-parse-json-in-java

--

原始问题如下。

<小时/>

我最近一直在研究 xml 文档和 java,但我在使用 google 天气 API 方面却完全没有运气。

假设我正在尝试做一个简单的对象来存储当前温度,并预测明天的温度,我该怎么做?

http://www.google.com/ig/api?weather=02110这是我家乡的工作示例。

谢谢

使用此代码:

public static final String[] xmlLoader(){
    String xmlData[] = new String[2];
    try {
        URL googleWeatherXml = new URL("http://www.google.com/ig/api?weather=02110");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();    
        Document doc = db.parse(googleWeatherXml.openStream());

         // normalize text representation
        doc.getDocumentElement ().normalize ();
        NodeList listOfWeek = doc.getElementsByTagName("");

            Node firstWeekNode = listOfWeek.item(dateCounter-1);
            int totalWeeks = listOfWeek.getLength();


            //Break xml file into parts, then break those parts down int an array by passing individual elements to srtings
            if(firstWeekNode.getNodeType() == Node.ELEMENT_NODE){
                Element firstWeekElement = (Element)firstWeekNode;
                //-------
                NodeList dateList = firstWeekElement.getElementsByTagName("date");
                Element dateElement = (Element)dateList.item(0);

                NodeList textDateList = dateElement.getChildNodes();
                xmlData[0]= (((Node)textDateList.item(0)).getNodeValue().trim()).toString();

                //-------
                NodeList riddleList = firstWeekElement.getElementsByTagName("riddle");
                Element riddleElement = (Element)riddleList.item(0);

                NodeList textRiddleList = riddleElement.getChildNodes();
                xmlData[1]= (((Node)textRiddleList.item(0)).getNodeValue().trim()).toString();

                //----
                NodeList lWSList = firstWeekElement.getElementsByTagName("lastWeekSolution");
                Element ageElement = (Element)lWSList.item(0);

                NodeList textLWSList = ageElement.getChildNodes();
                xmlData[2]= (((Node)textLWSList.item(0)).getNodeValue().trim()).toString();

                //------
            }//end of if clause

    }
    catch(MalformedURLException f){System.err.println(f.getMessage()); }
    catch(NullPointerException npe){
        System.out.println("The Weather Data you searched for is incorrect or does not yet exist, try again. ");
        String s[] = {" ", " "};
        main(s);
    }

   catch (SAXParseException err) {
    System.out.println ("** Parsing error" + ", line " 
         + err.getLineNumber () + ", uri " + err.getSystemId ());
    System.out.println(" " + err.getMessage ());

    }
    catch (SAXException e) {
    Exception x = e.getException ();
    ((x == null) ? e : x).printStackTrace ();

    }catch (Throwable t) {
    t.printStackTrace ();
    }
    return xmlData;
}

无论我做什么,都会得到大量的空指针。

最佳答案

当您调用 .getElementsByTagName() 时,您需要对返回的值进行保护:

NodeList dateList = firstWeekElement.getElementsByTagName("date");
if (datelist != null) {
    Element dateElement = (Element)dateList.item(0);

等等。

更新

现在我查看 XML,发现没有 元素;这就是 dateList 为空的原因。您想要查找诸如 之类的元素。

NodeList forecasts = firstWeekElement.getElementsByTagName("forecast_information");
if (forecasts != null) {
    Element forecastElement = (Element)forecasts.item(0);

关于java - 使用 Java 从 google Weather API 中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10487508/

相关文章:

java - 使用 spring 集成解压

java - SonarQube - 是否有一个 API 可以为您拥有的所有项目获取一部分分析?

api - 使用 Laravel JWT 重新验证时将旧 token 列入黑名单

java - Android - 启动屏幕应用程序卡住后 - 可以打开广告 - 仅适用于 Android 4.4+

java - Hibernate JTable 同步

java - Android如何在第一次从数据获取信息时转到其他 Activity

php - 普通 API 和 REST API 的输出之间的区别

javascript - ExtJS:空文件名(仅 .js?_dc=20181..)- 404 错误

rest - 什么是大型数据集上下文中的 RESTful 资源,即天气数据?

api - 带日期参数的天气 API