# aktuelle Wetterdaten für Java- Programm



## MQue (20. Mai 2009)

Hallo,

gibt es  irgendwo im web eine Möglichkeit, um aktuelle Wetterdaten abzufragen, vielleicht mit einem Webservice oder das ich einfache einen Client mache, der mir den Content einer Web- Seite ausließt und ich mir dann die Wetterdaten raushole,
Wäre euch dankbar für hilfe, 

Vielen Dank,


----------



## Geeeee (20. Mai 2009)

Yahoo! Weather - Yahoo! Developer Network


----------



## MQue (26. Mai 2009)

Geeeee hat gesagt.:


> Yahoo! Weather - Yahoo! Developer Network



Vielen Dank für die Info, ich hab mir jetzt die Seite durchgelesen und mir ist jetzt klar, dass ich die Wetterdaten abrufen kann, wenn ich z.B.: 
Yahoo! Weather - Munchen, GM eingebe,

mit den RSS- Feeds komm ich noch nicht so ganz klar, ich möchte ja einen Wetterbericht in meine Applikation einbauen, die Wetterdaten sollen mir per XML von diesem "WetterServer" zugesendet werden.
Hat schon mal jemand eine XML- Datei von dem Server abgerufen?

Wäre dankbar für Hinweise,


----------



## Illuvatar (26. Mai 2009)

Guck mal hier, erster Link


----------



## MQue (26. Mai 2009)

Illuvatar hat gesagt.:


> Guck mal hier, erster Link




Ah, super, das ist ja noch besser als das von Yahoo, ich hab nur ein Problem , ich kann nur wenig PHP und bin mir jetzt nicht im klaren, ob und wie ich das in Java machen kann?
Vielleicht kann mir da jemand mit ein paar Worten weiterhelfen. Mach ich da einfach eine Verbindung (Socket) zu der Seite (bzw. XML-Datei auf) und dann bekomm ich die XML- Datei oder wie kann man das realisieren?
Vielen Dank,



```
<?php
	header('content-type: text/html; charset=utf-8');
	$city = "New+York";
	$str  = array('Accept-Language: '.$_SERVER["HTTP_ACCEPT_LANGUAGE"]);
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, 'http://www.google.com/ig/api?weather='.$city);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $str);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 4);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
	$weather = simplexml_load_string(utf8_encode(curl_exec($ch)));
	$weather = $weather->weather;
?>
```


----------



## MQue (26. Mai 2009)

So hab jetzt mal einen Client programmiert der auch funktioniert, ich bekomme den Http- Header und die XML- Datei in einer Wurscht vom Google- Server zurück,

gibt es eine andere Möglichkeit mir nur die XML- Datei zu holen oder muss ich mir die Infos aus dem was ich da bekomme (Header und XML- Datei) rauspicken?


```
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class Main {

    public Main() throws UnknownHostException, IOException {
        final String command = "GET /ig/api?weather=Munchen HTTP/1.0\n\n";
        Socket sock = new Socket(InetAddress.getByName("www.google.com"), 80);
        OutputStream os = sock.getOutputStream();
        PrintWriter pr = new PrintWriter(os);
        pr.write(command);
        pr.flush();
        InputStream is = sock.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String readLine;
        while((readLine = br.readLine()) != null) {
            System.out.println("-> " + readLine);
            }
        }
   
    public static void main(String[] args) throws UnknownHostException, IOException {
       new Main();
    }
}
```


```
-> HTTP/1.0 200 OK
-> Date: Tue, 26 May 2009 02:33:13 GMT
-> Pragma: no-cache
-> Expires: Fri, 01 Jan 1990 00:00:00 GMT
-> Cache-Control: no-cache, no-store, must-revalidate
-> Content-Type: text/xml; charset=ISO-8859-1
-> Set-Cookie: ; path=/ig; domain=www.google.com
-> Set-Cookie: PREF=ID=::LM=1293:S=m1Yic_e669; expires=Thu, 26-May-2011 12:33:13 GMT; path=/; domain=.google.com
-> Server: igfe
-> 
-> <?xml version="1.0"?><xml_api_reply version="1"><weather module_
```


----------



## Illuvatar (26. Mai 2009)

Du machst es dir gerade etwas kompliziert 
In der Klasse java.net.URL gibt es eine Methode openStream, die das alles für dich erledigt. Dann musst du nur noch den Stream auslesen und das was da rauskommt ist dann auch der tatsächliche Inhalt, ohne den Header.


----------



## MQue (26. Mai 2009)

Illuvatar hat gesagt.:


> Du machst es dir gerade etwas kompliziert
> In der Klasse java.net.URL gibt es eine Methode openStream, die das alles für dich erledigt. Dann musst du nur noch den Stream auslesen und das was da rauskommt ist dann auch der tatsächliche Inhalt, ohne den Header.



OK, hab ich, aber ich bekomme immer noch den XML- Inhalt in einer Wurscht daher, muss ich mir auf meinem Client wieder eine XML- Datei bauen und diese mit Inhalt füllen oder geht das irgendwie, dass ich das, was daherkommt, als XML interpretiere?

Vielen Dank,


```
URL url = new URL("http://www.google.com/ig/api?weather=Munchen");
        InputStream is = url.openStream();
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader br = new BufferedReader(isr);
        String readLine;
        while((readLine = br.readLine()) != null) {
            System.out.println("-> " + readLine);
            }
```


----------



## Illuvatar (26. Mai 2009)

Michael1234 hat gesagt.:


> oder geht das irgendwie, dass ich das, was daherkommt, als XML interpretiere?



Ja das geht, und dazu gibt es mehrere Möglichkeiten, zum Beispiel den
XMLStreamReader (Java Platform SE 6)

Schau am besten mal mit Google und in Büchern (Galileo Computing :: Java ist auch eine Insel (8. Auflage))


----------



## max60watt (28. Mai 2009)

Hallo Michael1234,

ich würde folgendermaßen vorgehen:

Document zur Aufnahme der XML-Daten erstellen
XML-Daten über URL einlesen und parsen
XML-Knoten (Attribute) per X-Path ansprechen und verarbeiten


```
import javax.xml.parsers.*;
import org.w3c.dom.*;
import java.io.*;
import javax.xml.xpath.*;
import java.net.*;

class Main{
  public Main(){
    try{
      URL url = new URL("http://www.google.com/ig/api?weather=Munchen");
      InputStream inputStream = url.openStream();

      DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
      DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
      Document doc = docBuilder.parse(inputStream);

      inputStream.close();

      String result = XPathFactory.newInstance().newXPath().evaluate("/xml_api_reply/weather/forecast_information/city/@data", doc);
      System.out.println(result);
    }
    catch(javax.xml.parsers.ParserConfigurationException pce){
      pce.printStackTrace();
    }
    catch(org.xml.sax.SAXException sa){sa.printStackTrace();}
    catch(IOException ioe){ioe.printStackTrace();}
    catch(XPathExpressionException xpe){xpe.printStackTrace();}
  }
//---------------------------------------------------------------------------
  public static void main(String args[]){
    new Main();
  }
}
```

Grüss Max


----------

