1

編集:2020年の更新-Googleの天気APIは使用できなくなったため、以下の質問は無視してください。Weather APIの使用に興味がある場合、Darkskyはほとんどの人が使用する事実上のものです:https ://darksky.net/dev

Javaを使用する場合、JSONを解析する通常の方法はorg.jsonを使用することです:https ://devqa.io/java/how-to-parse-json-in-java

-

以下の元の質問。


私は最近xmlドキュメントとjavaを少しいじっていますが、googleWeatherAPIを使用することはまったくできませんでした。

現在の気温を保存し、明日の気温を予測するために単純なオブジェクトを作成しようとしていると仮定します。これを行うにはどうすればよいですか?

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

私が何をしようとも、大量のnullポインタを取得します。

4

1 に答える 1

2

.getElementsByTagName()を呼び出すときは、返される値にガードを付ける必要があります。

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

等。

アップデート

XMLを見ると、<date>要素がないことがわかります。そのため、dateListはnullです。<forecast_information>や<city>などの要素を探したいとします。

NodeList forecasts = firstWeekElement.getElementsByTagName("forecast_information");
if (forecasts != null) {
    Element forecastElement = (Element)forecasts.item(0);
于 2012-05-07T19:25:11.643 に答える